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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include <stdlib.h>
  2. #include "../portab.h"
  3. #include "bitstream.h"
  4. #include "zigzag.h"
  5. #include "vlc_codes.h"
  6. #include "mbcoding.h"
  7. #include "../utils/mbfunctions.h"
  8. #define ABS(X) (((X)>0)?(X):-(X))
  9. #define CLIP(X,A) (X > A) ? (A) : (X)
  10. VLC intra_table[65536]; 
  11. VLC inter_table[65536];
  12. VLC DCT3Dintra[4096];
  13. VLC DCT3Dinter[4096];
  14. static int16_t clip_table[4096];
  15. void init_vlc_tables(void)
  16. {
  17. int32_t k, l, i, intra, last;
  18. VLC *vlc[2];
  19. VLC **coeff_ptr;
  20. VLC *vlc1, *vlc2;
  21. vlc1 = DCT3Dintra;
  22. vlc2 = DCT3Dinter;
  23. vlc[0] = intra_table;
  24. vlc[1] = inter_table;
  25. // initialize the clipping table
  26. for(i = -2048; i < 2048; i++) {
  27. clip_table[i + 2048] = i;
  28. if(i < -255)
  29. clip_table[i + 2048] = -255;
  30. if(i > 255)
  31. clip_table[i + 2048] = 255;
  32. }
  33. // generate encoding vlc lookup tables
  34. for(i = 0; i < 4; i++) {
  35. intra = i % 2;
  36. last = i / 2;
  37. coeff_ptr = coeff_vlc[last + 2 * intra];
  38. for(k = -255; k < 256; k++) { // level
  39. int8_t *max_level_ptr = max_level[last + 2 * intra];
  40. int8_t *max_run_ptr = max_run[last + 2 * intra];
  41. for(l = 0; l < 64; l++) { // run
  42. int32_t level = k;
  43. uint32_t run = l;
  44. if((abs(level) <= max_level_ptr[run]) &&
  45.    (run <= max_run_ptr[abs(level)])) { // level < max_level and run < max_run
  46.    
  47. vlc[intra]->code = 0;
  48. vlc[intra]->len = 0;
  49. goto loop_end;
  50. }
  51. else {
  52. if(level > 0)      // correct level
  53. level -= max_level_ptr[run];
  54. else
  55. level += max_level_ptr[run];
  56. if((abs(level) <= max_level_ptr[run]) &&
  57.    (run <= max_run_ptr[abs(level)])) {
  58. vlc[intra]->code = 0x06;
  59. vlc[intra]->len = 8;
  60. goto loop_end;
  61. }
  62. if(level > 0)     // still here?
  63. level += max_level_ptr[run];    // restore level
  64. else
  65. level -= max_level_ptr[run];
  66. run -= max_run_ptr[abs(level)] + 1; // and change run
  67. if((abs(level) <= max_level_ptr[run]) &&
  68.    (run <= max_run_ptr[abs(level)])) {
  69. vlc[intra]->code = 0x0e;
  70. vlc[intra]->len = 9;
  71. goto loop_end;
  72. }
  73. run += max_run_ptr[abs(level)] + 1;
  74. }
  75. vlc[intra]->code = (uint32_t) ((l << 14) | (0x1e + last) << 20) |
  76.   (1 << 13) | ((k & 0xfff) << 1) | 1;
  77. vlc[intra]->len = 30;
  78. vlc[intra]++;
  79. continue;
  80. loop_end:
  81. if(level != 0) {
  82. vlc[intra]->code = (vlc[intra]->code << (coeff_ptr[run][abs(level) - 1].len + 1)) |
  83.    (coeff_ptr[run][abs(level) - 1].code << 1);
  84. vlc[intra]->len = (coeff_ptr[run][abs(level) - 1].len + 1) + vlc[intra]->len;
  85. if(level < 0)
  86. vlc[intra]->code += 1;
  87. }
  88. vlc[intra]++;
  89. }
  90. }
  91. }
  92. for(i = 0; i < 4096; i++) {
  93. if(i >= 512) {
  94. *vlc1 = DCT3Dtab3[(i >> 5) - 16];
  95. *vlc2 = DCT3Dtab0[(i >> 5) - 16];
  96. }
  97. else if(i >= 128) {
  98. *vlc1 = DCT3Dtab4[(i >> 2) - 32];
  99. *vlc2 = DCT3Dtab1[(i >> 2) - 32];
  100. }
  101. else if(i >= 8) {
  102. *vlc1 = DCT3Dtab5[i - 8];
  103. *vlc2 = DCT3Dtab2[i - 8];
  104. }
  105. else {
  106. *vlc1 = ERRtab[i];
  107. *vlc2 = ERRtab[i];
  108. }
  109. vlc1++;
  110. vlc2++;
  111. }
  112. DCT3D[0] = DCT3Dinter;
  113. DCT3D[1] = DCT3Dintra;
  114. }
  115. static __inline void CodeVector(Bitstream *bs,
  116. int16_t value,
  117. int16_t f_code,
  118. Statistics *pStat)
  119. {
  120. const int scale_factor = 1 << (f_code - 1);
  121. const int cmp = scale_factor << 5;
  122. if(value < (-1 * cmp))
  123. value += 64 * scale_factor;
  124. if(value > (cmp - 1))
  125. value -= 64 * scale_factor;
  126. pStat->iMvSum += value * value;
  127. pStat->iMvCount++;
  128. if (value == 0) {
  129. BitstreamPutBits(bs, mb_motion_table[32].code, mb_motion_table[32].len);
  130. } else {
  131. uint16_t length, code, mv_res, sign;
  132. length = 16 << f_code;
  133. f_code--;
  134. sign = (value < 0);
  135. if(value >= length)
  136. value -= 2 * length;
  137. else if(value < -length)
  138. value += 2 * length;
  139. if(sign)
  140. value = -value;
  141. value--;
  142. mv_res = value & ((1 << f_code) - 1);
  143. code = ((value - mv_res) >> f_code) + 1;
  144. if(sign)
  145. code = -code;
  146. code += 32;
  147. BitstreamPutBits(bs, mb_motion_table[code].code, mb_motion_table[code].len);
  148. if(f_code)
  149. BitstreamPutBits(bs, mv_res, f_code);
  150. }
  151. }
  152. static __inline void CodeCoeff(Bitstream *bs,
  153.        int16_t qcoeff[64],
  154.        VLC *table,
  155.        const uint16_t *zigzag,
  156.        uint16_t intra)
  157. {
  158. uint32_t j, last;
  159. short v;
  160. VLC *vlc;
  161. j = intra;
  162. last = intra;
  163. while((v = qcoeff[zigzag[j]]) == 0) j++;
  164.     
  165. do {
  166. // count zeroes
  167. vlc = table + 64*255 + (clip_table[2048+v] << 6) + j - last;
  168. last = ++j;
  169. while(j < 64 && (v = qcoeff[zigzag[j]]) == 0) j++;
  170. // write code
  171. if(j != 64) {
  172. BitstreamPutBits(bs, vlc->code, vlc->len);
  173. } else {
  174. vlc += 64*511;
  175. BitstreamPutBits(bs, vlc->code, vlc->len);
  176. break;
  177. }
  178. } while(1);
  179. }
  180. static void CodeBlockIntra(const MBParam * pParam,
  181.    const MACROBLOCK *pMB,
  182.    int16_t qcoeff[6*64],
  183.    Bitstream * bs,
  184.    Statistics * pStat)
  185. {
  186. uint32_t i, mcbpc, cbpy, bits;
  187. cbpy = pMB->cbp >> 2;
  188. // write mcbpc
  189. if(pParam->coding_type == I_VOP) {
  190. mcbpc = ((pMB->mode >> 1) & 3) | ((pMB->cbp & 3) << 2);
  191. BitstreamPutBits(bs, mcbpc_intra_tab[mcbpc].code, mcbpc_intra_tab[mcbpc].len);
  192. }
  193. else {
  194. mcbpc = (pMB->mode & 7) | ((pMB->cbp & 3) << 3);
  195. BitstreamPutBits(bs, mcbpc_inter_tab[mcbpc].code, mcbpc_inter_tab[mcbpc].len);
  196. }
  197. // ac prediction flag
  198. if(pMB->acpred_directions[0])
  199. BitstreamPutBits(bs, 1, 1);
  200. else
  201. BitstreamPutBits(bs, 0, 1);
  202. // write cbpy
  203. BitstreamPutBits (bs, cbpy_tab[cbpy].code, cbpy_tab[cbpy].len);
  204. // write dquant
  205. if(pMB->mode == MODE_INTRA_Q)
  206. BitstreamPutBits(bs, pMB->dquant, 2);
  207. // write interlacing
  208. if (pParam->global_flags & XVID_INTERLACING)
  209. {
  210. BitstreamPutBit(bs, pMB->field_dct);
  211. }
  212. // code block coeffs
  213. for(i = 0; i < 6; i++)
  214. {
  215. if(i < 4)
  216. BitstreamPutBits(bs,
  217.  dcy_tab[qcoeff[i*64 + 0] + 255].code,
  218.  dcy_tab[qcoeff[i*64 + 0] + 255].len);
  219. else
  220. BitstreamPutBits(bs,
  221.  dcc_tab[qcoeff[i*64 + 0] + 255].code,
  222.                  dcc_tab[qcoeff[i*64 + 0] + 255].len);
  223. if(pMB->cbp & (1 << (5 - i)))
  224. {
  225. bits = BitstreamPos(bs);
  226. CodeCoeff(bs,
  227.   &qcoeff[i*64],
  228.   intra_table,
  229.   scan_tables[pMB->acpred_directions[i]],
  230.   1);
  231. bits = BitstreamPos(bs) - bits;
  232. pStat->iTextBits += bits;
  233. }
  234. }
  235. }
  236. static void CodeBlockInter(const MBParam * pParam,
  237.    const MACROBLOCK *pMB,
  238.    int16_t qcoeff[6*64],
  239.    Bitstream * bs,
  240.    Statistics * pStat)
  241. {
  242. int32_t i;
  243. uint32_t bits, mcbpc, cbpy;
  244. mcbpc = (pMB->mode & 7) | ((pMB->cbp & 3) << 3);
  245. cbpy = 15 - (pMB->cbp >> 2);
  246. // write mcbpc
  247. BitstreamPutBits(bs, mcbpc_inter_tab[mcbpc].code, mcbpc_inter_tab[mcbpc].len);
  248. // write cbpy
  249. BitstreamPutBits(bs, cbpy_tab[cbpy].code, cbpy_tab[cbpy].len);
  250. // write dquant
  251. if(pMB->mode == MODE_INTER_Q)
  252. BitstreamPutBits(bs, pMB->dquant, 2);
  253.     
  254. // interlacing
  255. if (pParam->global_flags & XVID_INTERLACING)
  256. {
  257. BitstreamPutBit(bs, pMB->field_dct);
  258. DEBUG1("codep: field_dct: ", pMB->field_dct);
  259. // if inter block, write field ME flag
  260. if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q)
  261. {
  262. BitstreamPutBit(bs, pMB->field_pred);
  263. DEBUG1("codep: field_pred: ", pMB->field_pred);
  264. // write field prediction references
  265. if (pMB->field_pred)
  266. {
  267. BitstreamPutBit(bs, pMB->field_for_top);
  268. BitstreamPutBit(bs, pMB->field_for_bot);
  269. }
  270. }
  271. }
  272. // code motion vector(s)
  273. for(i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++)
  274. {
  275. CodeVector(bs, pMB->pmvs[i].x, pParam->fixed_code, pStat);
  276. CodeVector(bs, pMB->pmvs[i].y, pParam->fixed_code, pStat);
  277. }
  278. bits = BitstreamPos(bs);
  279. // code block coeffs
  280. for(i = 0; i < 6; i++)
  281. if(pMB->cbp & (1 << (5 - i)))
  282. CodeCoeff(bs, &qcoeff[i*64], inter_table, scan_tables[0], 0);
  283. bits = BitstreamPos(bs) - bits;
  284. pStat->iTextBits += bits;
  285. }
  286. void MBCoding(const MBParam * pParam,
  287.       MACROBLOCK *pMB,
  288.       int16_t qcoeff[6*64], 
  289.       Bitstream * bs,
  290.       Statistics * pStat)
  291. {
  292. int intra = (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q);
  293. if(pParam->coding_type == P_VOP) {
  294. if(pMB->cbp == 0 && pMB->mode == MODE_INTER &&
  295.    pMB->mvs[0].x == 0 && pMB->mvs[0].y == 0)
  296. {
  297. BitstreamPutBit(bs, 1); // not_coded
  298. return;
  299. }
  300. else
  301. BitstreamPutBit(bs, 0); // coded
  302. }
  303. if(intra)
  304. CodeBlockIntra(pParam, pMB, qcoeff, bs, pStat);
  305. else
  306. CodeBlockInter(pParam, pMB, qcoeff, bs, pStat);
  307. }
  308. /***************************************************************
  309.  * decoding stuff starts here                                  *
  310.  ***************************************************************/
  311. int get_mcbpc_intra(Bitstream * bs)
  312. {
  313. uint32_t index;
  314. while((index = BitstreamShowBits(bs, 9)) == 1)
  315. BitstreamSkip(bs, 9);
  316. index >>= 3;
  317. BitstreamSkip(bs, mcbpc_intra_table[index].len);
  318. return mcbpc_intra_table[index].code;
  319. }
  320. int get_mcbpc_inter(Bitstream * bs)
  321. {
  322. uint32_t index;
  323. while((index = CLIP(BitstreamShowBits(bs, 9), 256)) == 1)
  324. BitstreamSkip(bs, 9);
  325. BitstreamSkip(bs,  mcbpc_inter_table[index].len);
  326. return mcbpc_inter_table[index].code;
  327. }
  328. int get_cbpy(Bitstream * bs, int intra)
  329. {
  330. int cbpy;
  331. uint32_t index = BitstreamShowBits(bs, 6);
  332. BitstreamSkip(bs, cbpy_table[index].len);
  333. cbpy = cbpy_table[index].code;
  334. if(!intra)
  335. cbpy = 15 - cbpy;
  336. return cbpy;
  337. }
  338. int get_mv_data(Bitstream * bs)
  339. {
  340. uint32_t index;
  341. if(BitstreamGetBit(bs))
  342. return 0;
  343. index = BitstreamShowBits(bs, 12);
  344. if(index >= 512)
  345. {
  346. index = (index >> 8) - 2;
  347. BitstreamSkip(bs, TMNMVtab0[index].len);
  348. return TMNMVtab0[index].code;
  349. }
  350. if(index >= 128)
  351. {
  352. index = (index >> 2) - 32;
  353. BitstreamSkip(bs, TMNMVtab1[index].len);
  354. return TMNMVtab1[index].code;
  355. }
  356. index -= 4; 
  357. BitstreamSkip(bs, TMNMVtab2[index].len);
  358. return TMNMVtab2[index].code;
  359. }
  360. int get_mv(Bitstream * bs, int fcode)
  361. {
  362. int data;
  363. int res;
  364. int mv;
  365. int scale_fac = 1 << (fcode - 1);
  366. data = get_mv_data(bs);
  367. if(scale_fac == 1 || data == 0)
  368. return data;
  369. res = BitstreamGetBits(bs, fcode - 1);
  370. mv = ((ABS(data) - 1) * scale_fac) + res + 1;
  371. return data < 0 ? -mv : mv;
  372. }
  373. int get_dc_dif(Bitstream * bs, uint32_t dc_size)
  374. {
  375. int code = BitstreamGetBits(bs, dc_size);
  376. int msb = code >> (dc_size - 1);
  377. if(msb == 0)
  378. return (-1 * (code^((1 << dc_size) - 1)));
  379. return code;
  380. }
  381. int get_dc_size_lum(Bitstream * bs)
  382. {
  383. int code, i;
  384. code = BitstreamShowBits(bs, 11);
  385. for(i = 11; i > 3; i--) {
  386. if(code == 1) {
  387. BitstreamSkip(bs, i);
  388. return i + 1;
  389. }
  390. code >>= 1;
  391. }
  392. BitstreamSkip(bs, dc_lum_tab[code].len);
  393. return dc_lum_tab[code].code;
  394. }
  395. int get_dc_size_chrom(Bitstream * bs)
  396. {
  397. uint32_t code, i;
  398. code = BitstreamShowBits(bs, 12);
  399. for(i = 12; i > 2; i--) {
  400. if(code == 1) {
  401. BitstreamSkip(bs, i);
  402. return i;
  403. }
  404. code >>= 1;
  405. }
  406. return 3 - BitstreamGetBits(bs, 2);
  407. }
  408. void get_intra_block(Bitstream * bs, int16_t * block, int direction, int coeff) 
  409. {
  410. const uint16_t * scan = scan_tables[ direction ];
  411. int level;
  412. int run;
  413. int last;
  414. do
  415. {
  416. level = get_coeff(bs, &run, &last, 1, 0);
  417. if (run == -1)
  418. {
  419. DEBUG("fatal: invalid run");
  420. break;
  421. }
  422. coeff += run;
  423. block[ scan[coeff] ] = level;
  424. if (level < -127 || level > 127)
  425. {
  426. DEBUG1("warning: intra_overflow", level);
  427. }
  428. coeff++;
  429. } while (!last);
  430. }
  431. void get_inter_block(Bitstream * bs, int16_t * block) 
  432. {
  433. const uint16_t * scan = scan_tables[0];
  434. int p;
  435. int level;
  436. int run;
  437. int last;
  438. p = 0;
  439. do
  440. {
  441. level = get_coeff(bs, &run, &last, 0, 0);
  442. if (run == -1)
  443. {
  444. DEBUG("fatal: invalid run");
  445. break;
  446. }
  447. p += run;
  448. block[ scan[p] ] = level;
  449. if (level < -127 || level > 127)
  450. {
  451. DEBUG1("warning: inter_overflow", level);
  452. }
  453. p++;
  454. } while (!last);
  455. }