mp4_recon.c
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:3k
源码类别:

VC书籍

开发平台:

Visual C++

  1. #include "mp4_vars.h"
  2. #include "basic_prediction.h"
  3. #include "timer.h"
  4. /**
  5.  *
  6. **/
  7. void recon_comp (unsigned char *src, unsigned char *dst, 
  8. int lx, int w, int h, int x, 
  9. int y, int dx, int dy, int chroma)
  10. {
  11.   int xint, xh, yint, yh;
  12.   unsigned char *s, *d;
  13.   xint = dx >> 1;
  14.   xh = dx & 1;
  15.   yint = dy >> 1;
  16.   yh = dy & 1;
  17.   s = src + lx * (y + yint) + x + xint;
  18.   d = dst + lx * y + x;
  19. {
  20. int mc_driver = ((w!=8)<<3) | (mp4_state->hdr.rounding_type<<2) | (yh<<1) | (xh);
  21. switch (mc_driver)
  22. {
  23. case 0: case 4:
  24.     CopyBlock(s, d, lx);
  25.   break;
  26. case 1:
  27. CopyBlockHor(s, d, lx);
  28. break;
  29. case 2:
  30. CopyBlockVer(s, d, lx);
  31. break;
  32. case 3:
  33. CopyBlockHorVer(s, d, lx);
  34. break;
  35. case 5:
  36. CopyBlockHorRound(s, d, lx);
  37. break;
  38. case 6:
  39. CopyBlockVerRound(s, d, lx);
  40. break;
  41. case 7:
  42. CopyBlockHorVerRound(s, d, lx);
  43. break;
  44. case 8: case 12:
  45. CopyMBlock(s, d, lx);
  46. break;
  47. case 9:
  48. CopyMBlockHor(s, d, lx);
  49. break;
  50. case 10:
  51. CopyMBlockVer(s, d, lx);
  52. break;
  53. case 11:
  54. CopyMBlockHorVer(s, d, lx);
  55. break;
  56. case 13:
  57. CopyMBlockHorRound(s, d, lx);
  58. break;
  59. case 14:
  60. CopyMBlockVerRound(s, d, lx);
  61. break;
  62. case 15:
  63. CopyMBlockHorVerRound(s, d, lx);
  64. break;
  65. }
  66. }
  67. }
  68. /***/
  69. void reconstruct (int bx, int by, int mode)
  70. {
  71.   int w, h, lx, dx, dy, xp, yp, comp, sum;
  72.   int x, y, px, py;
  73.   unsigned char * src[3];
  74.   start_timer();
  75.   x = bx + 1;
  76.   y = by + 1;
  77.   lx = mp4_state->coded_picture_width;
  78.   src[0] = frame_for[0];
  79.   src[1] = frame_for[1];
  80.   src[2] = frame_for[2];
  81. w = 8;
  82. h = 8;
  83. px = bx << 4;
  84. py = by << 4;
  85. if (mode == INTER4V)
  86. {
  87. for (comp = 0; comp < 4; comp++)
  88. {
  89. dx = mp4_state->MV[0][comp][y][x];
  90. dy = mp4_state->MV[1][comp][y][x];
  91. xp = px + ((comp & 1) << 3);
  92. yp = py + ((comp & 2) << 2);
  93. recon_comp (src[0], frame_ref[0], lx, w, h, xp, yp, dx, dy, 0);
  94. }
  95. } else
  96. {
  97. dx = mp4_state->MV[0][0][y][x];
  98. dy = mp4_state->MV[1][0][y][x];
  99. recon_comp (src[0], frame_ref[0], lx, w << 1, h << 1, px, py, dx, dy, 0);
  100. }
  101. px = bx << 3;
  102. py = by << 3;
  103. if (mode == INTER4V)
  104. {
  105. sum = mp4_state->MV[0][0][y][x] + mp4_state->MV[0][1][y][x] + 
  106. mp4_state->MV[0][2][y][x] + mp4_state->MV[0][3][y][x];
  107. if (sum == 0) 
  108. dx = 0;
  109. else
  110. dx = sign (sum) * (mp4_tables->roundtab[abs (sum) % 16] + (abs (sum) / 16) * 2);
  111. sum = mp4_state->MV[1][0][y][x] + mp4_state->MV[1][1][y][x] + 
  112. mp4_state->MV[1][2][y][x] + mp4_state->MV[1][3][y][x];
  113. if (sum == 0)
  114. dy = 0;
  115. else
  116. dy = sign (sum) * (mp4_tables->roundtab[abs (sum) % 16] + (abs (sum) / 16) * 2);
  117. } else
  118. {
  119. dx = mp4_state->MV[0][0][y][x];
  120. dy = mp4_state->MV[1][0][y][x];
  121. dx = (dx % 4 == 0 ? dx >> 1 : (dx >> 1) | 1);
  122. dy = (dy % 4 == 0 ? dy >> 1 : (dy >> 1) | 1);
  123. }
  124. lx >>= 1;
  125. recon_comp (src[1], frame_ref[1], lx, w, h, px, py, dx, dy, 1);
  126. recon_comp (src[2], frame_ref[2], lx, w, h, px, py, dx, dy, 2);
  127. stop_recon_timer();
  128. }
  129. /***/