text_code.c
上传用户:enenge
上传日期:2007-01-08
资源大小:96k
文件大小:28k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**************************************************************************
  2.  *                                                                        *
  3.  * This code is developed by Adam Li.  This software is an                *
  4.  * implementation of a part of one or more MPEG-4 Video tools as          *
  5.  * specified in ISO/IEC 14496-2 standard.  Those intending to use this    *
  6.  * software module in hardware or software products are advised that its  *
  7.  * use may infringe existing patents or copyrights, and any such use      *
  8.  * would be at such party's own risk.  The original developer of this     *
  9.  * software module and his/her company, and subsequent editors and their  *
  10.  * companies (including Project Mayo), will have no liability for use of  *
  11.  * this software or modifications or derivatives thereof.                 *
  12.  *                                                                        *
  13.  * Project Mayo gives users of the Codec a license to this software       *
  14.  * module or modifications thereof for use in hardware or software        *
  15.  * products claiming conformance to the MPEG-4 Video Standard as          *
  16.  * described in the Open DivX license.                                    *
  17.  *                                                                        *
  18.  * The complete Open DivX license can be found at                         *
  19.  * http://www.projectmayo.com/opendivx/license.php .                      *
  20.  *                                                                        *
  21.  **************************************************************************/
  22. /**************************************************************************
  23.  *
  24.  *  text_code.c
  25.  *
  26.  *  Copyright (C) 2001  Project Mayo
  27.  *
  28.  *  Adam Li
  29.  *
  30.  *  DivX Advance Research Center <darc@projectmayo.com>
  31.  *
  32.  **************************************************************************/
  33. /* This file contains some functions for text coding of image.            */
  34. /* Some codes of this project come from MoMuSys MPEG-4 implementation.    */
  35. /* Please see seperate acknowledgement file for a list of contributors.   */
  36. #include "text_defs.h"
  37. #include "mot_code.h"
  38. #include "bitstream.h"
  39. #include "putvlc.h"
  40. #include "mot_util.h"
  41. #include "text_code_mb.h"
  42. #include "text_code.h"
  43. #define SKIPP       6
  44. extern FILE *ftrace;
  45. Void   Bits_CountMB_combined ( Int DQUANT,
  46. Int Mode,
  47. Int COD,
  48. Int ACpred_flag,
  49. Int CBP,
  50. Int vop_type,
  51. Bits *bits,
  52. Image *mottext_bitstream,
  53. Int *MB_transp_pattern
  54. );
  55. Int   doDCACpred ( Int *qcoeff,
  56. Int *CBP,
  57. Int ncoeffs,
  58. Int x_pos,
  59. Int y_pos,
  60. Int ***DC_store,
  61. Int QP,
  62. Int MB_width,
  63. Int direction[],
  64. Int mid_grey
  65. );
  66. Void nullfill(Int pred[], Int mid_grey);
  67. Int Idir_c(Int val, Int QP);
  68. Int   IntraDCSwitch_Decision _P_(( Int Mode,
  69. Int intra_dc_vlc_thr,
  70. Int Qp
  71. ));
  72. Int   FindCBP _P_(( Int *qcoeff,
  73. Int Mode,
  74. Int ncoeffs
  75. ));
  76. /***********************************************************CommentBegin******
  77.  *
  78.  * -- VopCodeShapeTextIntraCom --Intra texture encoding of one vop,
  79.  *                          Combined shape/(motion)/texture mode
  80.  *
  81.  * Purpose :
  82.  * Intra texture encoding of one vop (combined shape/(mot)/text mode)
  83.  *
  84.  * Arguments in :
  85.  *     Vop curr : the current vop to be coded
  86.  *      Int intra_dcpred_disable : disable intradc prediction
  87.  *      Image* AB_SizeConversionDecisions:
  88.  *      Image* AB_first_MMR_values
  89.  *      VolConfig *vol_config : configuration information
  90.  *      Int rc_type : rate control type:
  91.  *
  92.  * Arguments out :
  93.  *     Vop *rec_curr : the reconstructed current vop
  94.  *      Image *texture_bitstream : the output bitstream
  95.  *      Bits : statistics information
  96.  *
  97.  * Description :
  98.  * This function performs Intra texture encoding of one vop.
  99.  *
  100.  ***********************************************************CommentEnd********/
  101. Void VopCodeShapeTextIntraCom(Vop *curr,
  102. Vop *rec_curr, Image *mottext_bitstream)
  103. {
  104. Int QP = GetVopIntraQuantizer(curr);
  105. Int Mode = MODE_INTRA;
  106. Int* qcoeff;
  107. Int i, j;
  108. Int CBP, COD;
  109. Int CBPY, CBPC;
  110. Int num_pixels = GetImageSizeX(GetVopY(curr));
  111. Int num_lines = GetImageSizeY(GetVopY(curr));
  112. Int vop_type;
  113. Int ***DC_store;
  114. Int MB_width = num_pixels / MB_SIZE;
  115. Int MB_height = num_lines / MB_SIZE;
  116. Int m;
  117. Int ACpred_flag=-1;
  118. Int direction[6];
  119. Int switched=0;
  120. Int DQUANT =0;
  121. Bits nbits, *bits;
  122. bits = &nbits;
  123. qcoeff = (Int *) malloc (sizeof (Int) * 384);
  124. #ifdef _RC_DEBUG_
  125. fprintf(ftrace, "RC - VopCodeShapeTextIntraCom(): ---> CODING WITH: %d n",QP);
  126. #endif
  127. for (i = 0; i < 6; i++)
  128. direction[i] = 0;
  129. /* allocate space for 3D matrix to keep track of prediction values
  130.    for DC/AC prediction */
  131. DC_store = (Int ***)calloc(MB_width*MB_height, sizeof(Int **));
  132. for (i = 0; i < MB_width*MB_height; i++)
  133. {
  134. DC_store[i] = (Int **)calloc(6, sizeof(Int *));
  135. for (j = 0; j < 6; j++)
  136. DC_store[i][j] = (Int *)calloc(15, sizeof(Int));
  137. }
  138. Bits_Reset (bits);
  139. vop_type = PCT_INTRA;
  140. for (j = 0; j < num_lines/MB_SIZE; j++)   /* Macro Block loop */
  141. {
  142. for (i = 0; i < num_pixels/MB_SIZE; i++)
  143. {
  144. DQUANT = 0;
  145. COD = 0;
  146. bits->no_intra++;
  147. CodeMB (curr, rec_curr, NULL, i*MB_SIZE, j*MB_SIZE,
  148. num_pixels, QP+DQUANT, MODE_INTRA, qcoeff);
  149. m =0;
  150. DC_store[j*MB_width+i][0][m] = qcoeff[m]*cal_dc_scaler(QP+DQUANT,1);
  151. DC_store[j*MB_width+i][1][m] = qcoeff[m+64]*cal_dc_scaler(QP+DQUANT,1);
  152. DC_store[j*MB_width+i][2][m] = qcoeff[m+128]*cal_dc_scaler(QP+DQUANT,1);
  153. DC_store[j*MB_width+i][3][m] = qcoeff[m+192]*cal_dc_scaler(QP+DQUANT,1);
  154. DC_store[j*MB_width+i][4][m] = qcoeff[m+256]*cal_dc_scaler(QP+DQUANT,2);
  155. DC_store[j*MB_width+i][5][m] = qcoeff[m+320]*cal_dc_scaler(QP+DQUANT,2);
  156. for (m = 1; m < 8; m++)
  157. {
  158. DC_store[j*MB_width+i][0][m] = qcoeff[m];
  159. DC_store[j*MB_width+i][1][m] = qcoeff[m+64];
  160. DC_store[j*MB_width+i][2][m] = qcoeff[m+128];
  161. DC_store[j*MB_width+i][3][m] = qcoeff[m+192];
  162. DC_store[j*MB_width+i][4][m] = qcoeff[m+256];
  163. DC_store[j*MB_width+i][5][m] = qcoeff[m+320];
  164. }
  165. for (m = 0; m < 7; m++)
  166. {
  167. DC_store[j*MB_width+i][0][m+8] = qcoeff[(m+1)*8];
  168. DC_store[j*MB_width+i][1][m+8] = qcoeff[(m+1)*8+64];
  169. DC_store[j*MB_width+i][2][m+8] = qcoeff[(m+1)*8+128];
  170. DC_store[j*MB_width+i][3][m+8] = qcoeff[(m+1)*8+192];
  171. DC_store[j*MB_width+i][4][m+8] = qcoeff[(m+1)*8+256];
  172. DC_store[j*MB_width+i][5][m+8] = qcoeff[(m+1)*8+320];
  173. }
  174. CBP = FindCBP(qcoeff,Mode,64);
  175. /* Do the DC/AC prediction, changing the qcoeff values as
  176.    appropriate */
  177. if (GetVopIntraACDCPredDisable(curr) == 0)
  178. {
  179. ACpred_flag = doDCACpred(qcoeff, &CBP, 64, i, j, DC_store,
  180. QP+DQUANT, MB_width,
  181. direction,GetVopMidGrey(curr));
  182. }
  183. else
  184. ACpred_flag = -1;
  185. switched = IntraDCSwitch_Decision(Mode,
  186. GetVopIntraDCVlcThr(curr),
  187. QP);
  188. if (switched)
  189. CBP = FindCBP(qcoeff,MODE_INTER,64);
  190. if (DQUANT) Mode=MODE_INTRA_Q;else Mode=MODE_INTRA;
  191. QP+=DQUANT;
  192. CBPY = CBP >> 2;
  193. CBPY = CBPY & 15;   /* last 4 bits */
  194. CBPC = CBP & 3;   /* last 2 bits */
  195. Bits_CountMB_combined (DQUANT, Mode, COD, ACpred_flag, CBP,
  196. vop_type,
  197. bits, mottext_bitstream,/*MB_transp_pattern*/NULL);
  198. /* added the variable intra_dcpred_diable */
  199. MB_CodeCoeff(bits, qcoeff, Mode, CBP, 64,
  200. GetVopIntraACDCPredDisable(curr),
  201. NULL, mottext_bitstream,
  202. /*MB_transp_pattern*/NULL, direction,
  203. 1 /*GetVopErrorResDisable(curr)*/,
  204. 0 /*GetVopReverseVlc(curr)*/,
  205. switched,
  206. 0 /*curr->alternate_scan*/);
  207. }
  208. }
  209. /* Free allocated memory for 3D matrix */
  210. for (i = 0; i < MB_width*MB_height; i++)
  211. {
  212. for (j = 0; j < 6; j++)
  213. free(DC_store[i][j]);
  214. free(DC_store[i]);
  215. }
  216. free(DC_store);
  217. free ((Char*)qcoeff);
  218. }
  219. /***********************************************************CommentBegin******
  220.  *
  221.  * -- VopShapeMotText -- Combined Inter encoding of shape motion and texture
  222.  *
  223.  * Purpose :
  224.  * Combined Inter encoding of texture and motion.
  225.  *  Used by VopCodeMotTextInter
  226.  *
  227.  * Arguments in :
  228.  * Vop *curr : the current vop to be encoded
  229.  *  Vop *rec_prev: the previous reconstructed vop
  230.  *  Image *mot_x : the x-coordinates of the motion vectors
  231.  *  Image *mot_y : the y-coordinates of the motion vectors
  232.  *  Image *MB_decisions: Contains for each macroblock the encoding mode
  233.  * Int f_code_for: MV search range 1/2 pel: 1=32,2=64,...,7=2048
  234.  *      Image* AB_SizeConversionDecisions:
  235.  *      Image* AB_first_MMR_values :
  236.  *      Int intra_dcpred_disable : disable the intra dc prediction
  237.  *      VolConfig *vol_config : configuration information
  238.  *      Int rc_type : rate control type
  239.  *
  240.  * Arguments out :
  241.  * Vop *rec_curr : the reconstructed current vop
  242.  *  Image *mottext_bitstream : the output texture/motion bitstream
  243.  *  Bits *bits : Coding statistics
  244.  *
  245.  ***********************************************************CommentEnd********/
  246. Void VopShapeMotText (Vop *curr, Vop *comp, 
  247. Image *MB_decisions, Image *mot_x, Image *mot_y,
  248. Int f_code_for, 
  249. Int intra_acdc_pred_disable,
  250. Vop *rec_curr,
  251. Image *mottext_bitstream
  252. )
  253. {
  254. Int Mode=0;
  255. Int QP = GetVopQuantizer(curr);
  256. Int* qcoeff=NULL;
  257. Int i, j;
  258. Int CBP;
  259. Int COD;
  260. Int CBPY, CBPC;
  261. Int MB_in_width, MB_in_height, B_in_width, mbnum, boff;
  262. SInt p;
  263. SInt *ptr=NULL;
  264. Float *motx_ptr=NULL, *moty_ptr=NULL;
  265. Int num_pixels;
  266. Int num_lines;
  267. Int vop_type=PCT_INTER;
  268. Int ***DC_store=NULL;
  269. Int m, n;
  270. Int ACpred_flag=-1;
  271. Int direction[6];
  272. Int switched=0;
  273. Int DQUANT=0;
  274. Bits nbits, *bits;
  275. bits = &nbits;
  276. qcoeff = (Int *) malloc (sizeof (Int) * 384);
  277. num_pixels = GetImageSizeX(GetVopY(curr));
  278. num_lines = GetImageSizeY(GetVopY(curr));
  279. MB_in_width = num_pixels / MB_SIZE;
  280. MB_in_height = num_lines / MB_SIZE;
  281. B_in_width = 2 * MB_in_width;
  282. for (i = 0; i < 6; i++) direction[i] = 0;
  283. #ifdef _RC_DEBUG_
  284. printf("RC - VopShapeMotText(): ---> CODING WITH: %d n",QP);
  285. #endif
  286. /* allocate space for 3D matrix to keep track of prediction values
  287. for DC/AC prediction */
  288. DC_store = (Int ***)calloc(MB_in_width*MB_in_height,
  289. sizeof(Int **));
  290. for (i = 0; i < MB_in_width*MB_in_height; i++)
  291. {
  292. DC_store[i] = (Int **)calloc(6, sizeof(Int *));
  293. for (j = 0; j < 6; j++)
  294. DC_store[i][j] = (Int *)calloc(15, sizeof(Int));
  295. }
  296. Bits_Reset (bits);
  297. vop_type = PCT_INTER;
  298. ptr = (SInt *) GetImageData(MB_decisions);
  299. motx_ptr = (Float *) GetImageData(mot_x);
  300. moty_ptr = (Float *) GetImageData(mot_y);
  301. for (j = 0; j < num_lines/MB_SIZE; j++)
  302. {
  303. for (i = 0; i < MB_in_width; i++)
  304. {
  305. switched=0;
  306. p = *ptr;
  307. DQUANT = 0;
  308. /* Fill DC_store with default coeff values */
  309. for (m = 0; m < 6; m++)
  310. {
  311. DC_store[j*MB_in_width+i][m][0] = GetVopMidGrey(curr)*8;
  312. for (n = 1; n < 15; n++)
  313. DC_store[j*MB_in_width+i][m][n] = 0;
  314. }
  315. switch (p)
  316. {
  317. case MBM_INTRA:
  318. Mode = (DQUANT == 0) ? MODE_INTRA : MODE_INTRA_Q;
  319. bits->no_intra++;
  320. break;
  321. case MBM_INTER16:
  322. Mode = (DQUANT == 0) ? MODE_INTER : MODE_INTER_Q;
  323. bits->no_inter++;
  324. break;
  325. case MBM_INTER8:
  326. Mode = MODE_INTER4V;
  327. bits->no_inter4v++;
  328. DQUANT = 0;   /* Can't change QP for 8x8 mode */
  329. break;
  330. default:
  331. printf("invalid MB_decision value :%dn", p);
  332. exit(0);
  333. }
  334. CodeMB (curr, rec_curr, comp, i*MB_SIZE, j*MB_SIZE,
  335. num_pixels, QP + DQUANT, Mode, qcoeff);
  336. mbnum  = j*MB_in_width + i;
  337. boff = (2 * (mbnum  / MB_in_width) * B_in_width
  338. + 2 * (mbnum % MB_in_width));
  339. CBP = FindCBP(qcoeff,Mode,64);
  340. if ((CBP == 0) && (p == 1) && (*(motx_ptr +boff) == 0.0)
  341. && (*(moty_ptr +boff) == 0.0))
  342. {
  343. COD = 1;   /* skipped macroblock */
  344. BitstreamPutBits(mottext_bitstream, (long) (COD), 1L);
  345. bits->COD ++;
  346. *ptr = SKIPP;
  347. Mode = MODE_INTER;
  348. }
  349. else
  350. {
  351. COD = 0;   /* coded macroblock */
  352. if ((Mode == MODE_INTRA) || (Mode == MODE_INTRA_Q))
  353. {
  354. /* Store the qcoeff-values needed later for prediction */
  355. m =0;
  356. DC_store[j*MB_in_width+i][0][m] = qcoeff[m]*cal_dc_scaler(QP+DQUANT,1);
  357. DC_store[j*MB_in_width+i][1][m] = qcoeff[m+64]*cal_dc_scaler(QP+DQUANT,1);
  358. DC_store[j*MB_in_width+i][2][m] = qcoeff[m+128]*cal_dc_scaler(QP+DQUANT,1);
  359. DC_store[j*MB_in_width+i][3][m] = qcoeff[m+192]*cal_dc_scaler(QP+DQUANT,1);
  360. DC_store[j*MB_in_width+i][4][m] = qcoeff[m+256]*cal_dc_scaler(QP+DQUANT,2);
  361. DC_store[j*MB_in_width+i][5][m] = qcoeff[m+320]*cal_dc_scaler(QP+DQUANT,2);
  362. for (m = 1; m < 8; m++)
  363. {
  364. DC_store[j*MB_in_width+i][0][m] = qcoeff[m];
  365. DC_store[j*MB_in_width+i][1][m] = qcoeff[m+64];
  366. DC_store[j*MB_in_width+i][2][m] = qcoeff[m+128];
  367. DC_store[j*MB_in_width+i][3][m] = qcoeff[m+192];
  368. DC_store[j*MB_in_width+i][4][m] = qcoeff[m+256];
  369. DC_store[j*MB_in_width+i][5][m] = qcoeff[m+320];
  370. }
  371. for (m = 0; m < 7; m++)
  372. {
  373. DC_store[j*MB_in_width+i][0][m+8] = qcoeff[(m+1)*8];
  374. DC_store[j*MB_in_width+i][1][m+8] = qcoeff[(m+1)*8+64];
  375. DC_store[j*MB_in_width+i][2][m+8] = qcoeff[(m+1)*8+128];
  376. DC_store[j*MB_in_width+i][3][m+8] = qcoeff[(m+1)*8+192];
  377. DC_store[j*MB_in_width+i][4][m+8] = qcoeff[(m+1)*8+256];
  378. DC_store[j*MB_in_width+i][5][m+8] = qcoeff[(m+1)*8+320];
  379. }
  380. if (intra_acdc_pred_disable == 0)
  381. ACpred_flag = doDCACpred(qcoeff, &CBP, 64, i, j,
  382. DC_store,
  383. QP+DQUANT, MB_in_width,
  384. direction,GetVopMidGrey(curr));
  385. else
  386. ACpred_flag = -1;  /* Not to go into bitstream */
  387. }
  388. switched = IntraDCSwitch_Decision(Mode,
  389. GetVopIntraDCVlcThr(curr),
  390. QP);
  391. if (switched)
  392. CBP = FindCBP(qcoeff,MODE_INTER,64);
  393. CBPY = CBP >> 2;
  394. CBPY = CBPY & 15;   /* last 4 bits */
  395. CBPC = CBP & 3;   /* last 2 bits */
  396. Bits_CountMB_combined (DQUANT, Mode, COD, ACpred_flag, CBP,
  397. vop_type, bits,
  398. mottext_bitstream,/*MB_transp_pattern*/NULL);
  399. Bits_CountMB_Motion( mot_x, mot_y, NULL, 
  400. MB_decisions, i, j, f_code_for, 0 /*quarter_pel*/,
  401. mottext_bitstream,
  402. 1 /*GetVopErrorResDisable(curr)*/, 0,
  403. (Int **)NULL, 0 /*GetVopShape(curr)*/);
  404. MB_CodeCoeff(bits, qcoeff, Mode, CBP, 64,
  405. intra_acdc_pred_disable,
  406. NULL, mottext_bitstream,
  407. /*MB_transp_pattern*/NULL, direction,
  408. 1/*GetVopErrorResDisable(curr)*/,
  409. 0/*GetVopReverseVlc(curr)*/,
  410. switched,
  411. 0 /*curr->alternate_scan*/);
  412. }
  413. ptr++;
  414. } /* for i loop */
  415. } /* for j loop */
  416. /* Free allocated memory for 3D matrix */
  417. for (i = 0; i < MB_in_width*MB_in_height; i++)
  418. {
  419. for (j = 0; j < 6; j++)
  420. free(DC_store[i][j]);
  421. free(DC_store[i]);
  422. }
  423. free(DC_store);
  424. free ((Char*)qcoeff);
  425. }
  426. /***********************************************************CommentBegin******
  427.  *
  428.  * -- Bits_CountMB_combined -- texture encoding for combined texture/motion
  429.  *
  430.  * Purpose :
  431.  * Used for texture encoding in case of combined texture/motion
  432.  *  encoding. This function encodes the :
  433.  * - COD flag
  434.  * - MCBPC flag
  435.  * - CBPY flag
  436.  * - CBPC flag
  437.  * - DQUANT information
  438.  *
  439.  * Arguments in :
  440.  * SInt Mode : The macroblock encoding mode
  441.  *  Int CBP : Coded block pattern information
  442.  *  Int COD : Indicates whether this macroblock is coded or not
  443.  * Int ACpred_flag
  444.  *  Int vop_type : indicates the picture coding type
  445.  * (Intra,Inter)
  446.  *
  447.  * Arguments out :
  448.  * Bits* bits : a structure counting the number of bits
  449.  *  Image *bitstream : output texture bit stream *
  450.  *
  451.  ***********************************************************CommentEnd********/
  452. Void Bits_CountMB_combined(Int DQUANT, Int Mode, Int COD, Int ACpred_flag,
  453. Int CBP, Int vop_type,
  454. Bits* bits, Image *mottext_bitstream,Int *MB_transp_pattern)
  455. {
  456. Int   cbpy ,cbpc, length;
  457. Int   MBtype=-1;
  458. if ( Mode == MODE_INTRA ) MBtype = 3;
  459. if ( Mode == MODE_INTER ) MBtype = 0;
  460. if ( Mode == MODE_INTRA_Q) MBtype = 4;
  461. if ( Mode == MODE_INTER_Q) MBtype = 1;
  462. if ( Mode == MODE_INTER4V) MBtype = 2;
  463. /* modified by NTT for GMC coding : start
  464.   if ( Mode == MODE_DYN_SP) MBtype = 0;
  465.   if ( Mode == MODE_DYN_SP_Q) MBtype = 1;
  466. */
  467. if ( Mode == MODE_GMC) MBtype = 0;
  468. if ( Mode == MODE_GMC_Q) MBtype = 1;
  469. /* modified by NTT for GMC coding : end */
  470. #ifdef D_TRACE
  471. fprintf(ftrace, "DQUANT : %dtMODE : %dtVop Type : %dn", DQUANT, Mode, vop_type);
  472. fprintf(ftrace, "COD : %dtCBP : %dtAC Pred Flag : %dnn", COD, CBP, ACpred_flag);
  473. #endif
  474. cbpc = CBP & 3;
  475. cbpy = CBP>>2;
  476. /* COD */
  477. if (vop_type != PCT_INTRA )
  478. {
  479. if (COD)
  480. {
  481. printf("COD = 1 in Bits_CountMB_combined n");
  482. printf("This function should not be used if COD is '1' n");
  483. exit(1);
  484. }
  485.   /* write COD */
  486. BitstreamPutBits(mottext_bitstream, (long)(COD), 1L);
  487. bits->COD++;
  488. }
  489. /* MCBPC */
  490. if (vop_type == PCT_INTRA)
  491. length = PutMCBPC_Intra (cbpc, MBtype, mottext_bitstream);
  492. else
  493. length = PutMCBPC_Inter (cbpc, MBtype, mottext_bitstream);
  494. bits->MCBPC += length;
  495. /* MCSEL syntax */
  496. /* modified by NTT for GMC coding : start
  497.  if (((Mode == MODE_INTER) || (Mode == MODE_INTER_Q) || (Mode == MODE_DYN_SP) || (Mode == MODE_DYN_SP_Q))  && (vop_type == PCT_SPRITE))
  498. */
  499. if (((Mode == MODE_INTER) || (Mode == MODE_INTER_Q) || (Mode == MODE_GMC) || (Mode == MODE_GMC_Q))  && (vop_type == PCT_SPRITE))
  500. /* modified by NTT for GMC coding : end */
  501. {
  502. if ((Mode == MODE_INTER) || (Mode == MODE_INTER_Q))
  503. BitstreamPutBits(mottext_bitstream, (long) 0, 1L);
  504. /* modified by NTT for GMC coding : start
  505.   if ((Mode == MODE_DYN_SP) || (Mode == MODE_DYN_SP_Q))
  506. */
  507. if ((Mode == MODE_GMC) || (Mode == MODE_GMC_Q))
  508. /* modified by NTT for GMC coding : end */
  509. BitstreamPutBits(mottext_bitstream, (long) 1, 1L);
  510. bits->MCBPC += 1;
  511. }
  512. /* ACpred_flag */
  513. /* 17-Jan-97 JDL : correction no ACpred_flag in combined mode when intra_acdc_pred_disable is true */
  514. if ((Mode == MODE_INTRA || Mode==MODE_INTRA_Q) && ACpred_flag != -1)
  515. {
  516. BitstreamPutBits(mottext_bitstream, (long)ACpred_flag, 1L);
  517. bits->ACpred_flag += 1;
  518. }
  519. /* CBPY */
  520. length = PutCBPY (cbpy, (Char)(Mode==MODE_INTRA||Mode==MODE_INTRA_Q),/*MB_transp_pattern*/NULL,mottext_bitstream);
  521. bits->CBPY += length;
  522. /* DQUANT */
  523. /* modified by NTT for GMC coding : start
  524.   if ((Mode == MODE_INTER_Q) || (Mode == MODE_INTRA_Q)|| (Mode == MODE_DYN_SP_Q))
  525. */
  526. if ((Mode == MODE_INTER_Q) || (Mode == MODE_INTRA_Q)|| (Mode == MODE_GMC_Q))
  527. /* modified by NTT for GMC coding : end */
  528. {
  529. switch (DQUANT)
  530. {
  531. case -1:
  532. BitstreamPutBits(mottext_bitstream, 0L, 2L);
  533. break;
  534. case -2:
  535. BitstreamPutBits(mottext_bitstream, 1L, 2L);
  536. break;
  537. case 1:
  538. BitstreamPutBits(mottext_bitstream, 2L, 2L);
  539. break;
  540. case 2:
  541. BitstreamPutBits(mottext_bitstream, 3L, 2L);
  542. break;
  543. default:
  544. fprintf(stderr,"Invalid DQUANTn");
  545. exit(1);
  546. }
  547. bits->DQUANT += 2;
  548. }
  549. }
  550. /***********************************************************CommentBegin******
  551.  *
  552.  * -- doDCACpred -- Does DC/AC prediction. Changes qcoeff values as
  553.  *     appropriate.
  554.  *
  555.  * Purpose :
  556.  * Does DC/AC prediction. Changes qcoeff values as appropriate.
  557.  *
  558.  * Arguments in :
  559.  * Int CBP
  560.  * Int ncoeffs
  561.  * Int x_pos
  562.  * Int y_pos
  563.  * Int DC_store[][6][15]   Stores coefficient values per MB for
  564.  *         prediction (for one Vop)
  565.  * Int QP QP value for this MB
  566.  * Int MB_width
  567.  *
  568.  * Arguments in/out :
  569.  * Int *qcoeff
  570.  *
  571.  * Return values :
  572.  * Int The ACpred_flag, which is to be put into the bitstream
  573.  *
  574.  * Side effects :
  575.  * Modifies qcoeff if needed for the prediction.
  576.  *
  577.  ***********************************************************CommentEnd********/
  578. Int doDCACpred(Int *qcoeff, Int *CBP, Int ncoeffs, Int x_pos, Int y_pos,
  579. Int ***DC_store, Int QP, Int MB_width,
  580. Int direction[], Int mid_grey )
  581. {
  582. Int i, m;
  583. Int block_A, block_B, block_C;
  584. Int Xpos[6] = {-1, 0, -1, 0, -1, -1};
  585. Int Ypos[6] = {-1, -1, 0, 0, -1, -1};
  586. Int Xtab[6] = {1, 0, 3, 2, 4, 5};
  587. Int Ytab[6] = {2, 3, 0, 1, 4, 5};
  588. Int Ztab[6] = {3, 2, 1, 0, 4, 5};
  589. Int grad_hor, grad_ver, DC_pred;
  590. Int pred_A[15], pred_C[15];
  591. Int S = 0, S1, S2;
  592. Int diff;
  593. Int pcoeff[384];
  594. Int ACpred_flag=-1;
  595. /* Copy qcoeff to the prediction array pcoeff */
  596. for (i = 0; i < (6*ncoeffs); i++)
  597. {
  598. pcoeff[i] = qcoeff[i];
  599. }
  600. for (i = 0; i < 6; i++)
  601. {
  602. if ((x_pos == 0) && y_pos == 0)   /* top left corner */
  603. {
  604. block_A = (i == 1 || i == 3) ? DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0] : mid_grey*8;
  605. block_B = (i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])][Ztab[i]][0] : mid_grey*8;
  606. block_C = (i == 2 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0] : mid_grey*8;
  607. }
  608. else if (x_pos == 0)   /* left edge */
  609. {
  610. block_A = (i == 1 || i == 3) ? DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0] : mid_grey*8;
  611. block_B = (i == 1 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])][Ztab[i]][0] : mid_grey*8;
  612. block_C = DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0];
  613. }
  614. else if (y_pos == 0)   /* top row */
  615. {
  616. block_A = DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0];
  617. block_B = (i == 2 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])][Ztab[i]][0] : mid_grey*8;
  618. block_C = (i == 2 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0] : mid_grey*8;
  619. }
  620. else
  621. {
  622. block_A = DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0];
  623. block_B = (DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])]
  624. [Ztab[i]][0]);
  625. block_C = DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0];
  626. }
  627. grad_hor = block_B - block_C;
  628. grad_ver = block_A - block_B;
  629. if ((ABS(grad_ver)) < (ABS(grad_hor)))
  630. {
  631. DC_pred = block_C;
  632. direction[i] = 2;
  633. }
  634. else
  635. {
  636. DC_pred = block_A;
  637. direction[i] = 1;
  638. }
  639. pcoeff[i*ncoeffs] = qcoeff[i*ncoeffs] - (DC_pred+cal_dc_scaler(QP,(i<4)?1:2)/2)/cal_dc_scaler(QP,(i<4)?1:2);
  640. /* Find AC predictions */
  641. if ((x_pos == 0) && y_pos == 0)   /* top left corner */
  642. {
  643. if (i == 1 || i == 3)
  644. for (m = 0; m < 15; m++)
  645. pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
  646. else
  647. nullfill(pred_A,mid_grey);
  648. if (i == 2 || i == 3)
  649. for (m = 0; m < 15; m++)
  650. pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
  651. else
  652. nullfill(pred_C,mid_grey);
  653. }
  654. else if (x_pos == 0)   /* left edge */
  655. {
  656. if (i == 1 || i == 3)
  657. for (m = 0; m < 15; m++)
  658. pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
  659. else
  660. nullfill(pred_A,mid_grey);
  661. for (m = 0; m < 15; m++)
  662. pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
  663. }
  664. else if (y_pos == 0)   /* top row */
  665. {
  666. for (m = 0; m < 15; m++)
  667. pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
  668. if (i == 2 || i == 3)
  669. for (m = 0; m < 15; m++)
  670. pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
  671. else
  672. nullfill(pred_C,mid_grey);
  673. }
  674. else
  675. {
  676. for (m = 0; m < 15; m++)
  677. {
  678. pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
  679. pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
  680. }
  681. }
  682. #if 1   /* I think it should be like this, 14-NOV-1996 MW */
  683. S1 = 0;
  684. S2 = 0;
  685. /* Now decide on AC prediction */
  686. if (direction[i] == 1)   /* Horizontal, left COLUMN of block A */
  687. {
  688. for (m = 0; m < 7; m++)
  689. {
  690. S1 += ABS(qcoeff[i*ncoeffs+(m+1)*8]);
  691. diff = pcoeff[i*ncoeffs+(m+1)*8]
  692. = qcoeff[i*ncoeffs+(m+1)*8] - pred_A[m+8];
  693. S2 += ABS(diff);
  694. }
  695. }
  696. else   /* Vertical, top ROW of block C */
  697. {
  698. for (m = 1; m < 8; m++)
  699. {
  700. S1 += ABS(qcoeff[i*ncoeffs+m]);
  701. diff = pcoeff[i*ncoeffs+m]
  702. = qcoeff[i*ncoeffs+m] - pred_C[m];
  703. S2 += ABS(diff);
  704. }
  705. }
  706. S += (S1 - S2);
  707. #endif
  708. }
  709. /* Now change qcoeff for DC pred or DC/AC pred */
  710. if (S >=0)
  711. {
  712. for (i=0;i<ncoeffs*6; i++)
  713. /* Modified due to N2171 Cl. 2.2.14 MW 25-MAR-1998 */
  714. /* if ((i%64)&&(abs(pcoeff[i])>127)) { */
  715. if ((i%64)&&(abs(pcoeff[i])>2047))
  716. {
  717. printf("predicted AC out of range");
  718. S=-1;break;
  719. }
  720. }
  721. if (S >= 0)   /* Both DC and AC prediction */
  722. {
  723. ACpred_flag = 1;
  724. for (i = 0; i < ncoeffs*6; i++)
  725. {
  726. qcoeff[i] = pcoeff[i];
  727. }
  728. /* Update CBP for predicted coeffs. */
  729. *CBP = FindCBP(qcoeff, MODE_INTRA, 64);
  730. }
  731. else   /* Only DC prediction */
  732. {
  733. ACpred_flag = 0;
  734. for (i = 0; i < 6; i++)
  735. {
  736. qcoeff[i*ncoeffs] = pcoeff[i*ncoeffs];
  737. direction[i] = 0;
  738. }
  739. }
  740. return ACpred_flag;   /* To be put into bitstream */
  741. }
  742. /**
  743.  * Small routine to fill default prediction values into a DC_store entry
  744.  */
  745. Void nullfill(Int pred[], Int mid_grey)
  746. {
  747. Int i;
  748. pred[0] = mid_grey*8;
  749. for (i = 1; i < 15; i++)
  750. {
  751. pred[i] = 0;
  752. }
  753. }
  754. Int Idir_c(Int val, Int QP)
  755. {
  756. if (val<0) return (val-QP/2)/QP;
  757. else return (val+QP/2)/QP;
  758. }
  759. /***********************************************************CommentBegin******
  760.  *
  761.  * -- IntraDCSwitch_decisions --
  762.  *
  763.  * Purpose :
  764.  * decide whether to use inter AC table to encode DC
  765.  *
  766.  * Arguments in :
  767.  * Int Mode
  768.  *  Int intra_dc_vlc_thr
  769.  *  Int Qp
  770.  *
  771.  ***********************************************************CommentEnd********/
  772. Int IntraDCSwitch_Decision(Int Mode,Int intra_dc_vlc_thr,Int Qp)
  773. {
  774. Int switched =0;
  775. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  776. {
  777. if (intra_dc_vlc_thr==0)
  778. switched=0;
  779. else if (intra_dc_vlc_thr==7)
  780. switched=1;
  781. else if (Qp>=intra_dc_vlc_thr*2+11)
  782. switched=1;
  783. }
  784. return switched;
  785. }
  786. /***********************************************************CommentBegin******
  787.  *
  788.  * -- cal_dc_scaler -- calculation of DC quantization scale according
  789.  *   to the incoming Q and type;
  790.  *
  791.  * Arguments in :
  792.  *   Int Qp
  793.  *
  794.  ***********************************************************CommentEnd********/
  795. Int cal_dc_scaler (Int QP, Int type)
  796. {
  797. Int dc_scaler;
  798. if (type == 1)
  799. {
  800. if (QP > 0 && QP < 5) dc_scaler = 8;
  801. else if (QP > 4 && QP < 9) dc_scaler = 2 * QP;
  802. else if (QP > 8 && QP < 25) dc_scaler = QP + 8;
  803. else dc_scaler = 2 * QP - 16;
  804. }
  805. else
  806. {
  807. if (QP > 0 && QP < 5) dc_scaler = 8;
  808. else if (QP > 4 && QP < 25) dc_scaler = (QP + 13) / 2;
  809. else dc_scaler = QP - 6;
  810. }
  811. return dc_scaler;
  812. }
  813. /***********************************************************CommentBegin******
  814.  *
  815.  * -- FindCBP -- Find the CBP for a macroblock
  816.  *
  817.  * Purpose :
  818.  * Find the CBP for a macroblock
  819.  *
  820.  * Arguments in :
  821.  * Int *qcoeff : pointer to quantized coefficients
  822.  *  Int Mode : macroblock encoding mode information
  823.  *  Int ncoeffs : the number of coefficients
  824.  *
  825.  * Return values :
  826.  * Int CBP : The coded block pattern for a macroblock
  827.  *
  828.  ***********************************************************CommentEnd********/
  829. Int
  830. FindCBP (Int* qcoeff, Int Mode, Int ncoeffs)
  831. {
  832. Int i,j;
  833. Int CBP = 0;
  834. Int intra = (Mode == MODE_INTRA || Mode == MODE_INTRA_Q);
  835. /* Set CBP for this Macroblock */
  836. for (i = 0; i < 6; i++)
  837. {
  838. for (j = i*ncoeffs + intra; j < (i+1)*ncoeffs; j++)
  839. {
  840. if (qcoeff[j])
  841. {
  842. if (i == 0) {CBP |= 32;}
  843. else if (i == 1) {CBP |= 16;}
  844. else if (i == 2) {CBP |= 8;}
  845. else if (i == 3) {CBP |= 4;}
  846. else if (i == 4) {CBP |= 2;}
  847. else if (i == 5) {CBP |= 1;}
  848. else
  849. {
  850. fprintf (stderr, "Error in CBP assignmentn");
  851. exit(-1);
  852. }
  853. break;
  854. }
  855. }
  856. }
  857. return CBP;
  858. }