mbprediction.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #ifndef _MBPREDICTION_H_
  2. #define _MBPREDICTION_H_
  3. #include "../portab.h"
  4. #include "../decoder.h"
  5. #include "../global.h"
  6. #ifndef MIN
  7. #define MIN(X, Y) ((X)<(Y)?(X):(Y))
  8. #endif
  9. #ifndef MAX
  10. #define MAX(X, Y) ((X)>(Y)?(X):(Y))
  11. #endif
  12. // very large value
  13. #define MV_MAX_ERROR (4096 * 256)
  14. #define MVequal(A,B) ( ((A).x)==((B).x) && ((A).y)==((B).y) )
  15. void MBPrediction(MBParam *pParam,  /* <-- the parameter for ACDC and MV prediction */
  16.   uint32_t x_pos,  /* <-- The x position of the MB to be searched */
  17.   uint32_t y_pos,   /* <-- The y position of the MB to be searched */ 
  18.   uint32_t x_dim,  /* <-- Number of macroblocks in a row */
  19.   int16_t *qcoeff,   /* <-> The quantized DCT coefficients */ 
  20.   MACROBLOCK *MB_array  /* <-> the array of all the MB Infomations */
  21.     );
  22. void add_acdc(MACROBLOCK *pMB,
  23. uint32_t block, 
  24. int16_t dct_codes[64],
  25. uint32_t iDcScaler,
  26. int16_t predictors[8]);
  27. void predict_acdc(MACROBLOCK *pMBs,
  28. uint32_t x, uint32_t y, uint32_t mb_width, 
  29. uint32_t block, 
  30. int16_t qcoeff[64],
  31. uint32_t current_quant,
  32. int32_t iDcScaler,
  33. int16_t predictors[8]);
  34. /* This is somehow a copy of get_pmv, but returning all MVs and Minimum SAD 
  35.    instead of only Median MV */
  36. static __inline int get_pmvdata(const MACROBLOCK * const pMBs,
  37. const uint32_t x, const uint32_t y,
  38. const uint32_t x_dim,
  39. const uint32_t block,
  40. VECTOR * const pmv, 
  41. int32_t * const psad)
  42. {
  43. /* pmv are filled with: 
  44. [0]: Median (or whatever is correct in a special case)
  45. [1]: left neighbour
  46. [2]: top neighbour, 
  47. [3]: topright neighbour,
  48.    psad are filled with:
  49. [0]: minimum of [1] to [3]
  50. [1]: left neighbour's SAD // [1] to [3] are actually not needed  
  51. [2]: top neighbour's SAD, 
  52. [3]: topright neighbour's SAD,
  53. */
  54.     int xin1, xin2, xin3;
  55.     int yin1, yin2, yin3;
  56.     int vec1, vec2, vec3;
  57.     static VECTOR zeroMV;
  58.     uint32_t index = x + y * x_dim;
  59.     zeroMV.x = zeroMV.y = 0;
  60. // first row (special case)
  61.     if (y == 0 && (block == 0 || block == 1))
  62.     {
  63. if ((x == 0) && (block == 0)) // first column, first block
  64. pmv[0] = pmv[1] = pmv[2] = pmv[3] = zeroMV;
  65. psad[0] = psad[1] = psad[2] = psad[3] = MV_MAX_ERROR;
  66. return 0;
  67. }
  68. if (block == 1) // second block; has only a left neighbour
  69. {
  70. pmv[0] = pmv[1] = pMBs[index].mvs[0];
  71. pmv[2] = pmv[3] = zeroMV;
  72. psad[0] = psad[1] = pMBs[index].sad8[0];
  73. psad[2] = psad[3] = MV_MAX_ERROR;
  74. return 0;
  75. }
  76. else /* block==0, but x!=0, so again, there is a left neighbour*/
  77. {
  78. pmv[0] = pmv[1] = pMBs[index-1].mvs[1];
  79. pmv[2] = pmv[3] = zeroMV;
  80. psad[0] = psad[1] = pMBs[index-1].sad8[1];
  81. psad[2] = psad[3] = MV_MAX_ERROR;
  82. return 0;
  83. }
  84.     }
  85. /*
  86. MODE_INTER, vm18 page 48
  87. MODE_INTER4V vm18 page 51
  88. (x,y-1) (x+1,y-1)
  89. [   |   ] [ |   ]
  90. [ 2 | 3 ] [ 2 |   ]
  91. (x-1,y) (x,y) (x+1,y)
  92. [   | 1 ] [ 0 | 1 ] [ 0 |   ]
  93. [   | 3 ] [ 2 | 3 ] [ |   ]
  94. */
  95.     switch (block)
  96.     {
  97. case 0:
  98. xin1 = x - 1; yin1 = y; vec1 = 1; /* left */
  99. xin2 = x; yin2 = y - 1; vec2 = 2; /* top */
  100. xin3 = x + 1; yin3 = y - 1; vec3 = 2; /* top right */
  101. break;
  102. case 1:
  103. xin1 = x; yin1 = y; vec1 = 0;
  104. xin2 = x; yin2 = y - 1;   vec2 = 3;
  105. xin3 = x + 1; yin3 = y - 1; vec3 = 2;
  106.     break;
  107. case 2:
  108. xin1 = x - 1; yin1 = y; vec1 = 3;
  109. xin2 = x; yin2 = y; vec2 = 0;
  110. xin3 = x; yin3 = y; vec3 = 1;
  111.     break;
  112. default:
  113. xin1 = x; yin1 = y; vec1 = 2;
  114. xin2 = x; yin2 = y; vec2 = 0;
  115. xin3 = x; yin3 = y; vec3 = 1;
  116.     }
  117. if (xin1 < 0 || /* yin1 < 0  || */ xin1 >= (int32_t)x_dim)
  118. {
  119.      pmv[1] = zeroMV;
  120. psad[1] = MV_MAX_ERROR;
  121. }
  122. else
  123. {
  124. pmv[1] = pMBs[xin1 + yin1 * x_dim].mvs[vec1]; 
  125. psad[1] = pMBs[xin1 + yin1 * x_dim].sad8[vec1]; 
  126. }
  127. if (xin2 < 0 || /* yin2 < 0 || */ xin2 >= (int32_t)x_dim)
  128. {
  129. pmv[2] = zeroMV;
  130. psad[2] = MV_MAX_ERROR;
  131. }
  132. else
  133. {
  134. pmv[2] = pMBs[xin2 + yin2 * x_dim].mvs[vec2]; 
  135. psad[2] = pMBs[xin2 + yin2 * x_dim].sad8[vec2]; 
  136. }
  137. if (xin3 < 0 || /* yin3 < 0 || */ xin3 >= (int32_t)x_dim)
  138. {
  139. pmv[3] = zeroMV;
  140. psad[3] = MV_MAX_ERROR;
  141. }
  142. else
  143. {
  144. pmv[3] = pMBs[xin3 + yin3 * x_dim].mvs[vec3];
  145. psad[3] = pMBs[xin2 + yin2 * x_dim].sad8[vec3]; 
  146. }
  147. if ( (MVequal(pmv[1],pmv[2])) && (MVequal(pmv[1],pmv[3])) )
  148. { pmv[0]=pmv[1];
  149. psad[0]=psad[1];
  150. return 1;
  151. }
  152. // median,minimum
  153. pmv[0].x = MIN(MAX(pmv[1].x, pmv[2].x), MIN(MAX(pmv[2].x, pmv[3].x), MAX(pmv[1].x, pmv[3].x)));
  154. pmv[0].y = MIN(MAX(pmv[1].y, pmv[2].y), MIN(MAX(pmv[2].y, pmv[3].y), MAX(pmv[1].y, pmv[3].y)));
  155. psad[0]=MIN(MIN(psad[1],psad[2]),psad[3]);
  156. return 0;
  157. }
  158. #endif /* _MBPREDICTION_H_ */