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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1.  /******************************************************************************
  2.   *                                                                            *
  3.   *  This file is part of XviD, a free MPEG-4 video encoder/decoder            *
  4.   *                                                                            *
  5.   *  XviD is an implementation of a part of one or more MPEG-4 Video tools     *
  6.   *  as specified in ISO/IEC 14496-2 standard.  Those intending to use this    *
  7.   *  software module in hardware or software products are advised that its     *
  8.   *  use may infringe existing patents or copyrights, and any such use         *
  9.   *  would be at such party's own risk.  The original developer of this        *
  10.   *  software module and his/her company, and subsequent editors and their     *
  11.   *  companies, will have no liability for use of this software or             *
  12.   *  modifications or derivatives thereof.                                     *
  13.   *                                                                            *
  14.   *  XviD is free software; you can redistribute it and/or modify it           *
  15.   *  under the terms of the GNU General Public License as published by         *
  16.   *  the Free Software Foundation; either version 2 of the License, or         *
  17.   *  (at your option) any later version.                                       *
  18.   *                                                                            *
  19.   *  XviD is distributed in the hope that it will be useful, but               *
  20.   *  WITHOUT ANY WARRANTY; without even the implied warranty of                *
  21.   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             *
  22.   *  GNU General Public License for more details.                              *
  23.   *                                                                            *
  24.   *  You should have received a copy of the GNU General Public License         *
  25.   *  along with this program; if not, write to the Free Software               *
  26.   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA  *
  27.   *                                                                            *
  28.   ******************************************************************************/
  29.  /******************************************************************************
  30.   *                                                                            *
  31.   *  mbprediction.c                                                            *
  32.   *                                                                            *
  33.   *  Copyright (C) 2001 - Michael Militzer <isibaar@xvid.org>                  *
  34.   *  Copyright (C) 2001 - Peter Ross <pross@cs.rmit.edu.au>                    *
  35.   *                                                                            *
  36.   *  For more information visit the XviD homepage: http://www.xvid.org         *
  37.   *                                                                            *
  38.   ******************************************************************************/
  39.  /******************************************************************************
  40.   *                                                                            *
  41.   *  Revision history:                                                         *
  42.   *                                                                            *
  43.   *  12.12.2001 improved calc_acdc_prediction; removed need for memcpy         *
  44.   *  15.12.2001 moved pmv displacement to motion estimation                    *
  45.   *  30.11.2001 mmx cbp support                                                *
  46.   *  17.11.2001 initial version                                                *
  47.   *                                                                            *
  48.   ******************************************************************************/
  49. #include "../encoder.h"
  50. #include "mbprediction.h"
  51. #include "../utils/mbfunctions.h"
  52. #include "../bitstream/cbp.h"
  53. #define ABS(X) (((X)>0)?(X):-(X))
  54. #define DIV_DIV(A,B)    ( (A) > 0 ? ((A)+((B)>>1))/(B) : ((A)-((B)>>1))/(B) )
  55. static int __inline rescale(int predict_quant, int current_quant, int coeff)
  56. {
  57. return (coeff != 0) ? DIV_DIV((coeff) * (predict_quant), (current_quant)) : 0;
  58. }
  59. static const int16_t default_acdc_values[15] = { 
  60. 1024,
  61. 0, 0, 0, 0, 0, 0, 0,
  62. 0, 0, 0, 0, 0, 0, 0
  63. };
  64. /* get dc/ac prediction direction for a single block and place
  65. predictor values into MB->pred_values[j][..]
  66. */
  67. void predict_acdc(MACROBLOCK *pMBs,
  68.   uint32_t x, uint32_t y, uint32_t mb_width, 
  69.   uint32_t block, 
  70.   int16_t qcoeff[64],
  71.   uint32_t current_quant,
  72.   int32_t iDcScaler,
  73.   int16_t predictors[8])
  74. {
  75. int16_t *left, *top, *diag, *current;
  76. int32_t left_quant = current_quant;
  77. int32_t top_quant = current_quant;
  78. const int16_t *pLeft = default_acdc_values;
  79. const int16_t *pTop = default_acdc_values;
  80. const int16_t *pDiag = default_acdc_values;
  81. uint32_t index = x + y * mb_width; // current macroblock
  82. int * acpred_direction = &pMBs[index].acpred_directions[block];
  83. uint32_t i;
  84. left = top = diag = current = 0;
  85. // grab left,top and diag macroblocks
  86. // left macroblock 
  87. if(x && (pMBs[index - 1].mode == MODE_INTRA 
  88.  || pMBs[index - 1].mode == MODE_INTRA_Q)) {
  89. left = pMBs[index - 1].pred_values[0];
  90. left_quant = pMBs[index - 1].quant;
  91. //DEBUGI("LEFT", *(left+MBPRED_SIZE));
  92. }
  93.     
  94. // top macroblock
  95. if(y && (pMBs[index - mb_width].mode == MODE_INTRA 
  96.  || pMBs[index - mb_width].mode == MODE_INTRA_Q)) {
  97. top = pMBs[index - mb_width].pred_values[0];
  98. top_quant = pMBs[index - mb_width].quant;
  99. }
  100.     
  101. // diag macroblock 
  102. if(x && y && (pMBs[index - 1 - mb_width].mode == MODE_INTRA 
  103.       || pMBs[index - 1 - mb_width].mode == MODE_INTRA_Q)) {
  104. diag = pMBs[index - 1 - mb_width].pred_values[0];
  105. }
  106. current = pMBs[index].pred_values[0];
  107. // now grab pLeft, pTop, pDiag _blocks_ 
  108. switch (block) {
  109. case 0: 
  110. if(left)
  111. pLeft = left + MBPRED_SIZE;
  112. if(top)
  113. pTop = top + (MBPRED_SIZE << 1);
  114. if(diag)
  115. pDiag = diag + 3 * MBPRED_SIZE;
  116. break;
  117. case 1:
  118. pLeft = current;
  119. left_quant = current_quant;
  120. if(top) {
  121. pTop = top + 3 * MBPRED_SIZE;
  122. pDiag = top + (MBPRED_SIZE << 1);
  123. }
  124. break;
  125. case 2:
  126. if(left) {
  127. pLeft = left + 3 * MBPRED_SIZE;
  128. pDiag = left + MBPRED_SIZE;
  129. }
  130. pTop = current;
  131. top_quant = current_quant;
  132. break;
  133. case 3:
  134. pLeft = current + (MBPRED_SIZE << 1);
  135. left_quant = current_quant;
  136. pTop = current + MBPRED_SIZE;
  137. top_quant = current_quant;
  138. pDiag = current;
  139. break;
  140. case 4:
  141. if(left)
  142. pLeft = left + (MBPRED_SIZE << 2);
  143. if(top)
  144. pTop = top + (MBPRED_SIZE << 2);
  145. if(diag)
  146. pDiag = diag + (MBPRED_SIZE << 2);
  147. break;
  148. case 5:
  149. if(left)
  150. pLeft = left + 5 * MBPRED_SIZE;
  151. if(top)
  152. pTop = top + 5 * MBPRED_SIZE;
  153. if(diag)
  154. pDiag = diag + 5 * MBPRED_SIZE;
  155. break;
  156. }
  157. // determine ac prediction direction & ac/dc predictor
  158. // place rescaled ac/dc predictions into predictors[] for later use
  159. if(ABS(pLeft[0] - pDiag[0]) < ABS(pDiag[0] - pTop[0])) {
  160. *acpred_direction = 1;             // vertical
  161. predictors[0] = DIV_DIV(pTop[0], iDcScaler);
  162. for (i = 1; i < 8; i++)
  163. {
  164. predictors[i] = rescale(top_quant, current_quant, pTop[i]);
  165. }
  166. }
  167. else 
  168. {
  169. *acpred_direction = 2;             // horizontal
  170. predictors[0] = DIV_DIV(pLeft[0], iDcScaler);
  171. for (i = 1; i < 8; i++)
  172. {
  173. predictors[i] = rescale(left_quant, current_quant, pLeft[i + 7]);
  174. }
  175. }
  176. }
  177. /* decoder: add predictors to dct_codes[] and
  178.    store current coeffs to pred_values[] for future prediction 
  179. */
  180. void add_acdc(MACROBLOCK *pMB,
  181.       uint32_t block, 
  182.       int16_t dct_codes[64],
  183.       uint32_t iDcScaler,
  184.       int16_t predictors[8])
  185. {
  186. uint8_t acpred_direction = pMB->acpred_directions[block];
  187. int16_t * pCurrent = pMB->pred_values[block];
  188. uint32_t i;
  189. dct_codes[0] += predictors[0]; // dc prediction
  190. pCurrent[0] = dct_codes[0] * iDcScaler;
  191. if (acpred_direction == 1)
  192. {
  193. for (i = 1; i < 8; i++)
  194. {
  195. int level = dct_codes[i] + predictors[i];
  196. dct_codes[i] = level;
  197. pCurrent[i] = level;
  198. pCurrent[i+7] = dct_codes[i*8];
  199. }
  200. }
  201. else if (acpred_direction == 2)
  202. {
  203. for (i = 1; i < 8; i++)
  204. {
  205. int level = dct_codes[i*8] + predictors[i];
  206. dct_codes[i*8] = level;
  207. pCurrent[i+7] = level;
  208. pCurrent[i] = dct_codes[i];
  209. }
  210. }
  211. else
  212. {
  213. for (i = 1; i < 8; i++)
  214. {
  215. pCurrent[i] = dct_codes[i];
  216. pCurrent[i+7] = dct_codes[i*8];
  217. }
  218. }
  219. }
  220. // ******************************************************************
  221. // ******************************************************************
  222. /* encoder: subtract predictors from qcoeff[] and calculate S1/S2
  223. todo: perform [-127,127] clamping after prediction
  224. clamping must adjust the coeffs, so dequant is done correctly
  225.    
  226. S1/S2 are used  to determine if its worth predicting for AC
  227. S1 = sum of all (qcoeff - prediction)
  228. S2 = sum of all qcoeff
  229. */
  230. uint32_t calc_acdc(MACROBLOCK *pMB,
  231.    uint32_t block, 
  232.    int16_t qcoeff[64],
  233.    uint32_t iDcScaler,
  234.    int16_t predictors[8])
  235. {
  236. int16_t * pCurrent = pMB->pred_values[block];
  237. uint32_t i;
  238. uint32_t S1 = 0, S2 = 0;
  239. /* store current coeffs to pred_values[] for future prediction */
  240. pCurrent[0] = qcoeff[0] * iDcScaler;
  241. for(i = 1; i < 8; i++) {
  242. pCurrent[i] = qcoeff[i];
  243. pCurrent[i + 7] = qcoeff[i * 8];
  244. }
  245. /* subtract predictors and store back in predictors[] */
  246. qcoeff[0] = qcoeff[0] - predictors[0];
  247. if (pMB->acpred_directions[block] == 1) 
  248. {
  249. for(i = 1; i < 8; i++) {
  250. int16_t level;
  251. level = qcoeff[i];
  252. S2 += ABS(level);
  253. level -= predictors[i];
  254. S1 += ABS(level);
  255. predictors[i] = level;
  256. }
  257. }
  258. else // acpred_direction == 2
  259. {
  260. for(i = 1; i < 8; i++) {
  261. int16_t level;
  262. level = qcoeff[i*8];
  263. S2 += ABS(level);
  264. level -= predictors[i];
  265. S1 += ABS(level);
  266. predictors[i] = level;
  267. }
  268. }
  269.     
  270. return S2 - S1;
  271. }
  272. /* apply predictors[] to qcoeff */
  273. void apply_acdc(MACROBLOCK *pMB,
  274. uint32_t block, 
  275. int16_t qcoeff[64],
  276. int16_t predictors[8])
  277. {
  278. uint32_t i;
  279. if (pMB->acpred_directions[block] == 1) 
  280. {
  281. for(i = 1; i < 8; i++) 
  282. {
  283. qcoeff[i] = predictors[i];
  284. }
  285. }
  286. else 
  287. {
  288. for(i = 1; i < 8; i++) 
  289. {
  290. qcoeff[i*8] = predictors[i];
  291. }
  292. }
  293. }
  294. void MBPrediction(MBParam *pParam,
  295.   uint32_t x,
  296.   uint32_t y,
  297.   uint32_t mb_width,
  298.   int16_t qcoeff[6*64],
  299.   MACROBLOCK *mbs)
  300. {
  301. int32_t j;
  302. int32_t iDcScaler, iQuant = pParam->quant;
  303. int32_t S = 0;
  304. int16_t predictors[6][8];
  305. MACROBLOCK *pMB = &mbs[x + y * mb_width];
  306. if ((pMB->mode == MODE_INTRA) || (pMB->mode == MODE_INTRA_Q)) {
  307. for(j = 0; j < 6; j++) 
  308. {
  309. iDcScaler = get_dc_scaler(iQuant, (j < 4) ? 1 : 0);
  310. predict_acdc(mbs,
  311.      x,
  312.      y,
  313.      mb_width,
  314.      j,
  315.      &qcoeff[j*64],
  316.      iQuant,
  317.      iDcScaler,
  318.      predictors[j]);
  319. S += calc_acdc(pMB,
  320.        j,
  321.        &qcoeff[j*64],
  322.        iDcScaler,
  323.        predictors[j]);
  324. }
  325. if (S < 0) // dont predict
  326. {
  327. for(j = 0; j < 6; j++) 
  328. {
  329. pMB->acpred_directions[j] = 0;
  330. }
  331. }
  332. else
  333. {
  334. for(j = 0; j < 6; j++) 
  335. {
  336. apply_acdc(pMB, j, &qcoeff[j*64], predictors[j]);
  337. }
  338. }
  339. pMB->cbp = calc_cbp(qcoeff);
  340. }
  341. }