text_code.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:18k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "text_defs.h"
  2. #include "mot_code.h"
  3. #include "bitstream.h"
  4. #include "putvlc.h"
  5. #include "mot_util.h"
  6. #include "text_code_mb.h"
  7. #include "text_code.h"
  8. #define SKIPP       6
  9. extern FILE *ftrace;
  10. Void   Bits_CountMB_combined ( Int DQUANT,
  11. Int Mode,
  12. Int COD,
  13. Int ACpred_flag,
  14. Int CBP,
  15. Int vop_type,
  16. Bits *bits,
  17. Image *mottext_bitstream,
  18. Int *MB_transp_pattern
  19. );
  20. Int   doDCACpred ( Int *qcoeff,
  21. Int *CBP,
  22. Int ncoeffs,
  23. Int x_pos,
  24. Int y_pos,
  25. Int ***DC_store,
  26. Int QP,
  27. Int MB_width,
  28. Int direction[],
  29. Int mid_grey
  30. );
  31. Void nullfill(Int pred[], Int mid_grey);
  32. Int Idir_c(Int val, Int QP);
  33. Int   IntraDCSwitch_Decision _P_(( Int Mode,
  34. Int intra_dc_vlc_thr,
  35. Int Qp
  36. ));
  37. Int   FindCBP _P_(( Int *qcoeff,
  38. Int Mode,
  39. Int ncoeffs
  40. ));
  41. Void VopCodeShapeTextIntraCom(Vop *curr,
  42. Vop *rec_curr, Image *mottext_bitstream)
  43. {
  44. Int QP = GetVopIntraQuantizer(curr);
  45. Int Mode = MODE_INTRA;
  46. Int* qcoeff;
  47. Int i, j;
  48. Int CBP, COD;
  49. Int CBPY, CBPC;
  50. Int num_pixels = GetImageSizeX(GetVopY(curr));
  51. Int num_lines = GetImageSizeY(GetVopY(curr));
  52. Int vop_type;
  53. Int ***DC_store;
  54. Int MB_width = num_pixels / MB_SIZE;
  55. Int MB_height = num_lines / MB_SIZE;
  56. Int m;
  57. Int ACpred_flag=-1;
  58. Int direction[6];
  59. Int switched=0;
  60. Int DQUANT =0;
  61. Bits nbits, *bits;
  62. bits = &nbits;
  63. qcoeff = (Int *) malloc (sizeof (Int) * 384);
  64. #ifdef _RC_DEBUG_
  65. fprintf(ftrace, "RC - VopCodeShapeTextIntraCom(): ---> CODING WITH: %d n",QP);
  66. #endif
  67. for (i = 0; i < 6; i++)
  68. direction[i] = 0;
  69. DC_store = (Int ***)calloc(MB_width*MB_height, sizeof(Int **));
  70. for (i = 0; i < MB_width*MB_height; i++)
  71. {
  72. DC_store[i] = (Int **)calloc(6, sizeof(Int *));
  73. for (j = 0; j < 6; j++)
  74. DC_store[i][j] = (Int *)calloc(15, sizeof(Int));
  75. }
  76. Bits_Reset (bits);
  77. vop_type = PCT_INTRA;
  78. for (j = 0; j < num_lines/MB_SIZE; j++)   
  79. {
  80. for (i = 0; i < num_pixels/MB_SIZE; i++)
  81. {
  82. DQUANT = 0;
  83. COD = 0;
  84. bits->no_intra++;
  85. CodeMB (curr, rec_curr, NULL, i*MB_SIZE, j*MB_SIZE,
  86. num_pixels, QP+DQUANT, MODE_INTRA, qcoeff);
  87. m =0;
  88. DC_store[j*MB_width+i][0][m] = qcoeff[m]*cal_dc_scaler(QP+DQUANT,1);
  89. DC_store[j*MB_width+i][1][m] = qcoeff[m+64]*cal_dc_scaler(QP+DQUANT,1);
  90. DC_store[j*MB_width+i][2][m] = qcoeff[m+128]*cal_dc_scaler(QP+DQUANT,1);
  91. DC_store[j*MB_width+i][3][m] = qcoeff[m+192]*cal_dc_scaler(QP+DQUANT,1);
  92. DC_store[j*MB_width+i][4][m] = qcoeff[m+256]*cal_dc_scaler(QP+DQUANT,2);
  93. DC_store[j*MB_width+i][5][m] = qcoeff[m+320]*cal_dc_scaler(QP+DQUANT,2);
  94. for (m = 1; m < 8; m++)
  95. {
  96. DC_store[j*MB_width+i][0][m] = qcoeff[m];
  97. DC_store[j*MB_width+i][1][m] = qcoeff[m+64];
  98. DC_store[j*MB_width+i][2][m] = qcoeff[m+128];
  99. DC_store[j*MB_width+i][3][m] = qcoeff[m+192];
  100. DC_store[j*MB_width+i][4][m] = qcoeff[m+256];
  101. DC_store[j*MB_width+i][5][m] = qcoeff[m+320];
  102. }
  103. for (m = 0; m < 7; m++)
  104. {
  105. DC_store[j*MB_width+i][0][m+8] = qcoeff[(m+1)*8];
  106. DC_store[j*MB_width+i][1][m+8] = qcoeff[(m+1)*8+64];
  107. DC_store[j*MB_width+i][2][m+8] = qcoeff[(m+1)*8+128];
  108. DC_store[j*MB_width+i][3][m+8] = qcoeff[(m+1)*8+192];
  109. DC_store[j*MB_width+i][4][m+8] = qcoeff[(m+1)*8+256];
  110. DC_store[j*MB_width+i][5][m+8] = qcoeff[(m+1)*8+320];
  111. }
  112. CBP = FindCBP(qcoeff,Mode,64);
  113. if (GetVopIntraACDCPredDisable(curr) == 0)
  114. {
  115. ACpred_flag = doDCACpred(qcoeff, &CBP, 64, i, j, DC_store,
  116. QP+DQUANT, MB_width,
  117. direction,GetVopMidGrey(curr));
  118. }
  119. else
  120. ACpred_flag = -1;
  121. switched = IntraDCSwitch_Decision(Mode,
  122. GetVopIntraDCVlcThr(curr),
  123. QP);
  124. if (switched)
  125. CBP = FindCBP(qcoeff,MODE_INTER,64);
  126. if (DQUANT) Mode=MODE_INTRA_Q;else Mode=MODE_INTRA;
  127. QP+=DQUANT;
  128. CBPY = CBP >> 2;
  129. CBPY = CBPY & 15;   
  130. CBPC = CBP & 3;   
  131. Bits_CountMB_combined (DQUANT, Mode, COD, ACpred_flag, CBP,
  132. vop_type,
  133. bits, mottext_bitstream,NULL);
  134. MB_CodeCoeff(bits, qcoeff, Mode, CBP, 64,
  135. GetVopIntraACDCPredDisable(curr),
  136. NULL, mottext_bitstream,
  137. NULL, direction,
  138. 1 ,
  139. 0 ,
  140. switched,
  141. 0 );
  142. }
  143. }
  144. for (i = 0; i < MB_width*MB_height; i++)
  145. {
  146. for (j = 0; j < 6; j++)
  147. free(DC_store[i][j]);
  148. free(DC_store[i]);
  149. }
  150. free(DC_store);
  151. free ((Char*)qcoeff);
  152. }
  153. Void VopShapeMotText (Vop *curr, Vop *comp, 
  154. Image *MB_decisions, Image *mot_x, Image *mot_y,
  155. Int f_code_for, 
  156. Int intra_acdc_pred_disable,
  157. Vop *rec_curr,
  158. Image *mottext_bitstream
  159. )
  160. {
  161. Int Mode=0;
  162. Int QP = GetVopQuantizer(curr);
  163. Int* qcoeff=NULL;
  164. Int i, j;
  165. Int CBP;
  166. Int COD;
  167. Int CBPY, CBPC;
  168. Int MB_in_width, MB_in_height, B_in_width, mbnum, boff;
  169. SInt p;
  170. SInt *ptr=NULL;
  171. Float *motx_ptr=NULL, *moty_ptr=NULL;
  172. Int num_pixels;
  173. Int num_lines;
  174. Int vop_type=PCT_INTER;
  175. Int ***DC_store=NULL;
  176. Int m, n;
  177. Int ACpred_flag=-1;
  178. Int direction[6];
  179. Int switched=0;
  180. Int DQUANT=0;
  181. Bits nbits, *bits;
  182. bits = &nbits;
  183. qcoeff = (Int *) malloc (sizeof (Int) * 384);
  184. num_pixels = GetImageSizeX(GetVopY(curr));
  185. num_lines = GetImageSizeY(GetVopY(curr));
  186. MB_in_width = num_pixels / MB_SIZE;
  187. MB_in_height = num_lines / MB_SIZE;
  188. B_in_width = 2 * MB_in_width;
  189. for (i = 0; i < 6; i++) direction[i] = 0;
  190. #ifdef _RC_DEBUG_
  191. printf("RC - VopShapeMotText(): ---> CODING WITH: %d n",QP);
  192. #endif
  193. DC_store = (Int ***)calloc(MB_in_width*MB_in_height,
  194. sizeof(Int **));
  195. for (i = 0; i < MB_in_width*MB_in_height; i++)
  196. {
  197. DC_store[i] = (Int **)calloc(6, sizeof(Int *));
  198. for (j = 0; j < 6; j++)
  199. DC_store[i][j] = (Int *)calloc(15, sizeof(Int));
  200. }
  201. Bits_Reset (bits);
  202. vop_type = PCT_INTER;
  203. ptr = (SInt *) GetImageData(MB_decisions);
  204. motx_ptr = (Float *) GetImageData(mot_x);
  205. moty_ptr = (Float *) GetImageData(mot_y);
  206. for (j = 0; j < num_lines/MB_SIZE; j++)
  207. {
  208. for (i = 0; i < MB_in_width; i++)
  209. {
  210. switched=0;
  211. p = *ptr;
  212. DQUANT = 0;
  213. for (m = 0; m < 6; m++)
  214. {
  215. DC_store[j*MB_in_width+i][m][0] = GetVopMidGrey(curr)*8;
  216. for (n = 1; n < 15; n++)
  217. DC_store[j*MB_in_width+i][m][n] = 0;
  218. }
  219. switch (p)
  220. {
  221. case MBM_INTRA:
  222. Mode = (DQUANT == 0) ? MODE_INTRA : MODE_INTRA_Q;
  223. bits->no_intra++;
  224. break;
  225. case MBM_INTER16:
  226. Mode = (DQUANT == 0) ? MODE_INTER : MODE_INTER_Q;
  227. bits->no_inter++;
  228. break;
  229. case MBM_INTER8:
  230. Mode = MODE_INTER4V;
  231. bits->no_inter4v++;
  232. DQUANT = 0;   
  233. break;
  234. default:
  235. printf("invalid MB_decision value :%dn", p);
  236. exit(0);
  237. }
  238. CodeMB (curr, rec_curr, comp, i*MB_SIZE, j*MB_SIZE,
  239. num_pixels, QP + DQUANT, Mode, qcoeff);
  240. mbnum  = j*MB_in_width + i;
  241. boff = (2 * (mbnum  / MB_in_width) * B_in_width
  242. + 2 * (mbnum % MB_in_width));
  243. CBP = FindCBP(qcoeff,Mode,64);
  244. if ((CBP == 0) && (p == 1) && (*(motx_ptr +boff) == 0.0)
  245. && (*(moty_ptr +boff) == 0.0))
  246. {
  247. COD = 1;   
  248. BitstreamPutBits(mottext_bitstream, (long) (COD), 1L);
  249. bits->COD ++;
  250. *ptr = SKIPP;
  251. Mode = MODE_INTER;
  252. }
  253. else
  254. {
  255. COD = 0;   
  256. if ((Mode == MODE_INTRA) || (Mode == MODE_INTRA_Q))
  257. {
  258. m =0;
  259. DC_store[j*MB_in_width+i][0][m] = qcoeff[m]*cal_dc_scaler(QP+DQUANT,1);
  260. DC_store[j*MB_in_width+i][1][m] = qcoeff[m+64]*cal_dc_scaler(QP+DQUANT,1);
  261. DC_store[j*MB_in_width+i][2][m] = qcoeff[m+128]*cal_dc_scaler(QP+DQUANT,1);
  262. DC_store[j*MB_in_width+i][3][m] = qcoeff[m+192]*cal_dc_scaler(QP+DQUANT,1);
  263. DC_store[j*MB_in_width+i][4][m] = qcoeff[m+256]*cal_dc_scaler(QP+DQUANT,2);
  264. DC_store[j*MB_in_width+i][5][m] = qcoeff[m+320]*cal_dc_scaler(QP+DQUANT,2);
  265. for (m = 1; m < 8; m++)
  266. {
  267. DC_store[j*MB_in_width+i][0][m] = qcoeff[m];
  268. DC_store[j*MB_in_width+i][1][m] = qcoeff[m+64];
  269. DC_store[j*MB_in_width+i][2][m] = qcoeff[m+128];
  270. DC_store[j*MB_in_width+i][3][m] = qcoeff[m+192];
  271. DC_store[j*MB_in_width+i][4][m] = qcoeff[m+256];
  272. DC_store[j*MB_in_width+i][5][m] = qcoeff[m+320];
  273. }
  274. for (m = 0; m < 7; m++)
  275. {
  276. DC_store[j*MB_in_width+i][0][m+8] = qcoeff[(m+1)*8];
  277. DC_store[j*MB_in_width+i][1][m+8] = qcoeff[(m+1)*8+64];
  278. DC_store[j*MB_in_width+i][2][m+8] = qcoeff[(m+1)*8+128];
  279. DC_store[j*MB_in_width+i][3][m+8] = qcoeff[(m+1)*8+192];
  280. DC_store[j*MB_in_width+i][4][m+8] = qcoeff[(m+1)*8+256];
  281. DC_store[j*MB_in_width+i][5][m+8] = qcoeff[(m+1)*8+320];
  282. }
  283. if (intra_acdc_pred_disable == 0)
  284. ACpred_flag = doDCACpred(qcoeff, &CBP, 64, i, j,
  285. DC_store,
  286. QP+DQUANT, MB_in_width,
  287. direction,GetVopMidGrey(curr));
  288. else
  289. ACpred_flag = -1;  
  290. }
  291. switched = IntraDCSwitch_Decision(Mode,
  292. GetVopIntraDCVlcThr(curr),
  293. QP);
  294. if (switched)
  295. CBP = FindCBP(qcoeff,MODE_INTER,64);
  296. CBPY = CBP >> 2;
  297. CBPY = CBPY & 15;   
  298. CBPC = CBP & 3;   
  299. Bits_CountMB_combined (DQUANT, Mode, COD, ACpred_flag, CBP,
  300. vop_type, bits,
  301. mottext_bitstream,NULL);
  302. Bits_CountMB_Motion( mot_x, mot_y, NULL, 
  303. MB_decisions, i, j, f_code_for, 0 ,
  304. mottext_bitstream,
  305. 1 , 0,
  306. (Int **)NULL, 0 );
  307. MB_CodeCoeff(bits, qcoeff, Mode, CBP, 64,
  308. intra_acdc_pred_disable,
  309. NULL, mottext_bitstream,
  310. NULL, direction,
  311. 1,
  312. 0,
  313. switched,
  314. 0 );
  315. }
  316. ptr++;
  317. for (i = 0; i < MB_in_width*MB_in_height; i++)
  318. {
  319. for (j = 0; j < 6; j++)
  320. free(DC_store[i][j]);
  321. free(DC_store[i]);
  322. }
  323. free(DC_store);
  324. free ((Char*)qcoeff);
  325. }
  326. Void Bits_CountMB_combined(Int DQUANT, Int Mode, Int COD, Int ACpred_flag,
  327. Int CBP, Int vop_type,
  328. Bits* bits, Image *mottext_bitstream,Int *MB_transp_pattern)
  329. {
  330. Int   cbpy ,cbpc, length;
  331. Int   MBtype=-1;
  332. if ( Mode == MODE_INTRA ) MBtype = 3;
  333. if ( Mode == MODE_INTER ) MBtype = 0;
  334. if ( Mode == MODE_INTRA_Q) MBtype = 4;
  335. if ( Mode == MODE_INTER_Q) MBtype = 1;
  336. if ( Mode == MODE_INTER4V) MBtype = 2;
  337. if ( Mode == MODE_GMC) MBtype = 0;
  338. if ( Mode == MODE_GMC_Q) MBtype = 1;
  339. #ifdef D_TRACE
  340. fprintf(ftrace, "DQUANT : %dtMODE : %dtVop Type : %dn", DQUANT, Mode, vop_type);
  341. fprintf(ftrace, "COD : %dtCBP : %dtAC Pred Flag : %dnn", COD, CBP, ACpred_flag);
  342. #endif
  343. cbpc = CBP & 3;
  344. cbpy = CBP>>2;
  345. if (vop_type != PCT_INTRA )
  346. {
  347. if (COD)
  348. {
  349. printf("COD = 1 in Bits_CountMB_combined n");
  350. printf("This function should not be used if COD is '1' n");
  351. exit(1);
  352. }
  353.   
  354. BitstreamPutBits(mottext_bitstream, (long)(COD), 1L);
  355. bits->COD++;
  356. }
  357. if (vop_type == PCT_INTRA)
  358. length = PutMCBPC_Intra (cbpc, MBtype, mottext_bitstream);
  359. else
  360. length = PutMCBPC_Inter (cbpc, MBtype, mottext_bitstream);
  361. bits->MCBPC += length;
  362. if (((Mode == MODE_INTER) || (Mode == MODE_INTER_Q) || (Mode == MODE_GMC) || (Mode == MODE_GMC_Q))  && (vop_type == PCT_SPRITE))
  363. {
  364. if ((Mode == MODE_INTER) || (Mode == MODE_INTER_Q))
  365. BitstreamPutBits(mottext_bitstream, (long) 0, 1L);
  366. if ((Mode == MODE_GMC) || (Mode == MODE_GMC_Q))
  367. BitstreamPutBits(mottext_bitstream, (long) 1, 1L);
  368. bits->MCBPC += 1;
  369. }
  370. if ((Mode == MODE_INTRA || Mode==MODE_INTRA_Q) && ACpred_flag != -1)
  371. {
  372. BitstreamPutBits(mottext_bitstream, (long)ACpred_flag, 1L);
  373. bits->ACpred_flag += 1;
  374. }
  375. length = PutCBPY (cbpy, (Char)(Mode==MODE_INTRA||Mode==MODE_INTRA_Q),NULL,mottext_bitstream);
  376. bits->CBPY += length;
  377. if ((Mode == MODE_INTER_Q) || (Mode == MODE_INTRA_Q)|| (Mode == MODE_GMC_Q))
  378. {
  379. switch (DQUANT)
  380. {
  381. case -1:
  382. BitstreamPutBits(mottext_bitstream, 0L, 2L);
  383. break;
  384. case -2:
  385. BitstreamPutBits(mottext_bitstream, 1L, 2L);
  386. break;
  387. case 1:
  388. BitstreamPutBits(mottext_bitstream, 2L, 2L);
  389. break;
  390. case 2:
  391. BitstreamPutBits(mottext_bitstream, 3L, 2L);
  392. break;
  393. default:
  394. fprintf(stderr,"Invalid DQUANTn");
  395. exit(1);
  396. }
  397. bits->DQUANT += 2;
  398. }
  399. }
  400. Int doDCACpred(Int *qcoeff, Int *CBP, Int ncoeffs, Int x_pos, Int y_pos,
  401. Int ***DC_store, Int QP, Int MB_width,
  402. Int direction[], Int mid_grey )
  403. {
  404. Int i, m;
  405. Int block_A, block_B, block_C;
  406. Int Xpos[6] = {-1, 0, -1, 0, -1, -1};
  407. Int Ypos[6] = {-1, -1, 0, 0, -1, -1};
  408. Int Xtab[6] = {1, 0, 3, 2, 4, 5};
  409. Int Ytab[6] = {2, 3, 0, 1, 4, 5};
  410. Int Ztab[6] = {3, 2, 1, 0, 4, 5};
  411. Int grad_hor, grad_ver, DC_pred;
  412. Int pred_A[15], pred_C[15];
  413. Int S = 0, S1, S2;
  414. Int diff;
  415. Int pcoeff[384];
  416. Int ACpred_flag=-1;
  417. for (i = 0; i < (6*ncoeffs); i++)
  418. {
  419. pcoeff[i] = qcoeff[i];
  420. }
  421. for (i = 0; i < 6; i++)
  422. {
  423. if ((x_pos == 0) && y_pos == 0)   
  424. {
  425. block_A = (i == 1 || i == 3) ? DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0] : mid_grey*8;
  426. block_B = (i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])][Ztab[i]][0] : mid_grey*8;
  427. block_C = (i == 2 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0] : mid_grey*8;
  428. }
  429. else if (x_pos == 0)   
  430. {
  431. block_A = (i == 1 || i == 3) ? DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0] : mid_grey*8;
  432. block_B = (i == 1 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])][Ztab[i]][0] : mid_grey*8;
  433. block_C = DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0];
  434. }
  435. else if (y_pos == 0)   
  436. {
  437. block_A = DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0];
  438. block_B = (i == 2 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])][Ztab[i]][0] : mid_grey*8;
  439. block_C = (i == 2 || i == 3) ? DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0] : mid_grey*8;
  440. }
  441. else
  442. {
  443. block_A = DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][0];
  444. block_B = (DC_store[(y_pos+Ypos[i])*MB_width+(x_pos+Xpos[i])]
  445. [Ztab[i]][0]);
  446. block_C = DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][0];
  447. }
  448. grad_hor = block_B - block_C;
  449. grad_ver = block_A - block_B;
  450. if ((ABS(grad_ver)) < (ABS(grad_hor)))
  451. {
  452. DC_pred = block_C;
  453. direction[i] = 2;
  454. }
  455. else
  456. {
  457. DC_pred = block_A;
  458. direction[i] = 1;
  459. }
  460. 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);
  461. if ((x_pos == 0) && y_pos == 0)   
  462. {
  463. if (i == 1 || i == 3)
  464. for (m = 0; m < 15; m++)
  465. pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
  466. else
  467. nullfill(pred_A,mid_grey);
  468. if (i == 2 || i == 3)
  469. for (m = 0; m < 15; m++)
  470. pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
  471. else
  472. nullfill(pred_C,mid_grey);
  473. }
  474. else if (x_pos == 0)   
  475. {
  476. if (i == 1 || i == 3)
  477. for (m = 0; m < 15; m++)
  478. pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
  479. else
  480. nullfill(pred_A,mid_grey);
  481. for (m = 0; m < 15; m++)
  482. pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
  483. }
  484. else if (y_pos == 0)   
  485. {
  486. for (m = 0; m < 15; m++)
  487. pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
  488. if (i == 2 || i == 3)
  489. for (m = 0; m < 15; m++)
  490. pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
  491. else
  492. nullfill(pred_C,mid_grey);
  493. }
  494. else
  495. {
  496. for (m = 0; m < 15; m++)
  497. {
  498. pred_A[m] = Idir_c(((DC_store[y_pos*MB_width+(x_pos+Xpos[i])][Xtab[i]][m]) * QP*2) , 2*QP);
  499. pred_C[m] = Idir_c(((DC_store[(y_pos+Ypos[i])*MB_width+x_pos][Ytab[i]][m]) * QP*2) , 2*QP);
  500. }
  501. }
  502. #if 1   
  503. S1 = 0;
  504. S2 = 0;
  505. if (direction[i] == 1)   
  506. {
  507. for (m = 0; m < 7; m++)
  508. {
  509. S1 += ABS(qcoeff[i*ncoeffs+(m+1)*8]);
  510. diff = pcoeff[i*ncoeffs+(m+1)*8]
  511. = qcoeff[i*ncoeffs+(m+1)*8] - pred_A[m+8];
  512. S2 += ABS(diff);
  513. }
  514. }
  515. else   
  516. {
  517. for (m = 1; m < 8; m++)
  518. {
  519. S1 += ABS(qcoeff[i*ncoeffs+m]);
  520. diff = pcoeff[i*ncoeffs+m]
  521. = qcoeff[i*ncoeffs+m] - pred_C[m];
  522. S2 += ABS(diff);
  523. }
  524. }
  525. S += (S1 - S2);
  526. #endif
  527. }
  528. if (S >=0)
  529. {
  530. for (i=0;i<ncoeffs*6; i++)
  531. if ((i%64)&&(abs(pcoeff[i])>2047))
  532. {
  533. printf("predicted AC out of range");
  534. S=-1;break;
  535. }
  536. }
  537. if (S >= 0)   
  538. {
  539. ACpred_flag = 1;
  540. for (i = 0; i < ncoeffs*6; i++)
  541. {
  542. qcoeff[i] = pcoeff[i];
  543. }
  544. *CBP = FindCBP(qcoeff, MODE_INTRA, 64);
  545. }
  546. else   
  547. {
  548. ACpred_flag = 0;
  549. for (i = 0; i < 6; i++)
  550. {
  551. qcoeff[i*ncoeffs] = pcoeff[i*ncoeffs];
  552. direction[i] = 0;
  553. }
  554. }
  555. return ACpred_flag;   
  556. }
  557. Void nullfill(Int pred[], Int mid_grey)
  558. {
  559. Int i;
  560. pred[0] = mid_grey*8;
  561. for (i = 1; i < 15; i++)
  562. {
  563. pred[i] = 0;
  564. }
  565. }
  566. Int Idir_c(Int val, Int QP)
  567. {
  568. if (val<0) return (val-QP/2)/QP;
  569. else return (val+QP/2)/QP;
  570. }
  571. Int IntraDCSwitch_Decision(Int Mode,Int intra_dc_vlc_thr,Int Qp)
  572. {
  573. Int switched =0;
  574. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  575. {
  576. if (intra_dc_vlc_thr==0)
  577. switched=0;
  578. else if (intra_dc_vlc_thr==7)
  579. switched=1;
  580. else if (Qp>=intra_dc_vlc_thr*2+11)
  581. switched=1;
  582. }
  583. return switched;
  584. }
  585. Int cal_dc_scaler (Int QP, Int type)
  586. {
  587. Int dc_scaler;
  588. if (type == 1)
  589. {
  590. if (QP > 0 && QP < 5) dc_scaler = 8;
  591. else if (QP > 4 && QP < 9) dc_scaler = 2 * QP;
  592. else if (QP > 8 && QP < 25) dc_scaler = QP + 8;
  593. else dc_scaler = 2 * QP - 16;
  594. }
  595. else
  596. {
  597. if (QP > 0 && QP < 5) dc_scaler = 8;
  598. else if (QP > 4 && QP < 25) dc_scaler = (QP + 13) / 2;
  599. else dc_scaler = QP - 6;
  600. }
  601. return dc_scaler;
  602. }
  603. Int
  604. FindCBP (Int* qcoeff, Int Mode, Int ncoeffs)
  605. {
  606. Int i,j;
  607. Int CBP = 0;
  608. Int intra = (Mode == MODE_INTRA || Mode == MODE_INTRA_Q);
  609. for (i = 0; i < 6; i++)
  610. {
  611. for (j = i*ncoeffs + intra; j < (i+1)*ncoeffs; j++)
  612. {
  613. if (qcoeff[j])
  614. {
  615. if (i == 0) {CBP |= 32;}
  616. else if (i == 1) {CBP |= 16;}
  617. else if (i == 2) {CBP |= 8;}
  618. else if (i == 3) {CBP |= 4;}
  619. else if (i == 4) {CBP |= 2;}
  620. else if (i == 5) {CBP |= 1;}
  621. else
  622. {
  623. fprintf (stderr, "Error in CBP assignmentn");
  624. exit(-1);
  625. }
  626. break;
  627. }
  628. }
  629. }
  630. return CBP;
  631. }