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

流媒体/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_bits.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 utility functions to write to bitstreams for   */
  34. /* texture part of the coding.                                            */
  35. /* Some codes of this project come from MoMuSys MPEG-4 implementation.    */
  36. /* Please see seperate acknowledgement file for a list of contributors.   */
  37. #include "momusys.h"
  38. #include "text_defs.h"
  39. #include "bitstream.h"
  40. #include "text_bits.h"
  41. #include "putvlc.h"
  42. #include "zigzag.h"   /* added, 14-NOV-1996 MW */
  43. #include "max_level.h"   /* 3-mode esc */
  44. Int   IntraDC_dpcm (Int val, Int lum, Image *bitstream);
  45. Int   CodeCoeff (Int j_start, Int Mode, Int qcoeff[],
  46. Int block, Int ncoeffs, Image *bitstream);
  47. Int   CodeCoeff_RVLC (Int j_start, Int Mode, Int qcoeff[],
  48. Int block, Int ncoeffs, Image *bitstream);
  49. /***********************************************************CommentBegin******
  50.  *
  51.  * -- MB_CodeCoeff -- Codes coefficients, does DC/AC prediction
  52.  *
  53.  * Purpose :
  54.  * Codes coefficients, does DC/AC prediction
  55.  *
  56.  * Arguments in :
  57.  * Int *qcoeff : quantized dct-coefficients
  58.  *  Int Mode : encoding mode
  59.  *  Int CBP : coded block pattern
  60.  *  Int ncoeffs : number of coefficients per block
  61.  *  Int x_pos : the horizontal position of the macroblock in the vop
  62.  *      Int intra_dcpred_disable : disable the intradc prediction
  63.  * Int transp_pattern[]: Describes which blocks are transparent
  64.  *
  65.  * Arguments out :
  66.  * Bits *bits : struct to count the number of texture bits
  67.  *  Image *bitstream : output bitstream
  68.  *
  69.  * Description :
  70.  * The intradc prediction can be switched off by setting the variable
  71.  * intradc_pred_disable to '1'.
  72.  *
  73.  ***********************************************************CommentEnd********/
  74. Void MB_CodeCoeff(Bits* bits, Int *qcoeff,
  75. Int Mode, Int CBP, Int ncoeffs,
  76. Int intra_dcpred_disable,
  77. Image *DCbitstream,
  78. Image *bitstream,
  79. Int transp_pattern[], Int direction[],
  80. Int error_res_disable,
  81. Int reverse_vlc,
  82. Int switched,
  83. Int alternate_scan)
  84. {
  85. Int i, m, coeff[64];
  86. Int *zz = alternate_scan ? zigzag_v : zigzag;
  87. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  88. {
  89. if (intra_dcpred_disable == 0)
  90. {
  91. for (i = 0; i < 6; i++)
  92. {
  93. // if (i>3 || transp_pattern[i]!=1)  /* Not transparent */
  94. {
  95. if (!alternate_scan)
  96. {
  97. switch (direction[i])
  98. {
  99. case 1: zz = zigzag_v; break;
  100. case 2: zz = zigzag_h; break;
  101. case 0: break;
  102. default: fprintf(stderr, "MB_CodeCoeff(): Error in zigzag directionn");
  103. exit(-1);
  104. }
  105. }
  106. /* Do the zigzag scanning of coefficients */
  107. for (m = 0; m < 64; m++)
  108. {
  109. *(coeff + zz[m]) = qcoeff[i*ncoeffs+m];
  110. }
  111. if (switched==0)
  112. {
  113. if (error_res_disable)
  114. {
  115. if (i < 4)
  116. bits->Y += IntraDC_dpcm(coeff[0],1,bitstream);
  117. else
  118. bits->C += IntraDC_dpcm(coeff[0],0,bitstream);
  119. }
  120. else
  121. {
  122. if (i < 4)
  123. bits->Y += IntraDC_dpcm(coeff[0],1,DCbitstream);
  124. else
  125. bits->C += IntraDC_dpcm(coeff[0],0,DCbitstream);
  126. }
  127. }
  128. /* Code AC coeffs. dep. on block pattern MW 15-NOV-1996 */
  129. if ((i==0 && CBP&32) ||
  130. (i==1 && CBP&16) ||
  131. (i==2 && CBP&8)  ||
  132. (i==3 && CBP&4)  ||
  133. (i==4 && CBP&2)  ||
  134. (i==5 && CBP&1))
  135. {
  136. if (error_res_disable || ((!error_res_disable) && (!reverse_vlc)))
  137. {
  138. if (i < 4)
  139. bits->Y += CodeCoeff(1-switched,Mode, coeff,i,ncoeffs,bitstream);
  140. else
  141. bits->C += CodeCoeff(1-switched,Mode, coeff,i,ncoeffs,
  142. bitstream);
  143. }
  144. else
  145. {
  146. if (i < 4)
  147. bits->Y += CodeCoeff_RVLC(1-switched,Mode, coeff, i,
  148. ncoeffs, bitstream);
  149. else
  150. bits->C += CodeCoeff_RVLC(1-switched,Mode, coeff, i,
  151. ncoeffs, bitstream);
  152. }
  153. }
  154. }
  155. }
  156. }
  157. else   /* Without ACDC prediction */
  158. {
  159. for (i = 0; i < 6; i++)
  160. {
  161. // if (i>3 || transp_pattern[i]!=1)  /* Not transparent */
  162. {
  163. /* Do the zigzag scanning of coefficients */
  164. for (m = 0; m < 64; m++)
  165. *(coeff + zz[m]) = qcoeff[i*ncoeffs+m];
  166. if (switched==0)
  167. {
  168. if (error_res_disable)
  169. {
  170. if (coeff[0] != 128)
  171. BitstreamPutBits(bitstream,(long)(coeff[0]),8L);
  172. else
  173. BitstreamPutBits(bitstream, 255L, 8L);
  174. }
  175. else
  176. {
  177. if (coeff[0] != 128)
  178. BitstreamPutBits(DCbitstream,(long)(coeff[0]),8L);
  179. else
  180. BitstreamPutBits(DCbitstream,255L, 8L);
  181. }
  182. if (i < 4)
  183. bits->Y += 8;
  184. else
  185. bits->C += 8;
  186. }
  187. if ((i==0 && CBP&32) || (i==1 && CBP&16) ||
  188. (i==2 && CBP&8) || (i==3 && CBP&4) ||
  189. (i==4 && CBP&2) || (i==5 && CBP&1))
  190. {
  191. /* send coeff, not qcoeff !!! MW 07-11-96 */
  192. if (error_res_disable || ((!error_res_disable) && (!reverse_vlc)))
  193. {
  194. if (i < 4)
  195. bits->Y += CodeCoeff(1-switched,Mode, coeff,i,ncoeffs,
  196. bitstream);
  197. else
  198. bits->C += CodeCoeff(1-switched,Mode, coeff,i,ncoeffs,
  199. bitstream);
  200. }
  201. else
  202. {
  203. if (i < 4)
  204. bits->Y += CodeCoeff_RVLC(1-switched,Mode, coeff, i,
  205. ncoeffs, bitstream);
  206. else
  207. bits->C += CodeCoeff_RVLC(1-switched,Mode, coeff, i,
  208. ncoeffs, bitstream);
  209. }
  210. }
  211. }
  212. }
  213. }
  214. }
  215. else   /* inter block encoding */
  216. {
  217. for (i = 0; i < 6; i++)
  218. {
  219. /* Do the zigzag scanning of coefficients */
  220. for (m = 0; m < 64; m++)
  221. *(coeff + zz[m]) = qcoeff[i*ncoeffs+m];
  222. if ((i==0 && CBP&32) ||
  223. (i==1 && CBP&16) ||
  224. (i==2 && CBP&8) ||
  225. (i==3 && CBP&4) ||
  226. (i==4 && CBP&2) ||
  227. (i==5 && CBP&1))
  228. {
  229. if (error_res_disable || ((!error_res_disable) && (!reverse_vlc)))
  230. {
  231. if (i < 4)
  232. bits->Y += CodeCoeff(0,Mode, coeff, i, ncoeffs, bitstream);
  233. else
  234. bits->C += CodeCoeff(0,Mode, coeff, i, ncoeffs, bitstream);
  235. }
  236. else
  237. {
  238. if (i < 4)
  239. bits->Y += CodeCoeff_RVLC(0,Mode, coeff, i, ncoeffs,
  240. bitstream);
  241. else
  242. bits->C += CodeCoeff_RVLC(0,Mode, coeff, i, ncoeffs,
  243. bitstream);
  244. }
  245. }
  246. }
  247. }
  248. }
  249. /***********************************************************CommentBegin******
  250.  *
  251.  * -- IntraDC_dpcm -- DPCM Encoding of INTRADC in case of Intra macroblocks
  252.  *
  253.  * Purpose :
  254.  * DPCM Encoding of INTRADC in case of Intra macroblocks
  255.  *
  256.  * Arguments in :
  257.  * Int val : the difference value with respect to the previous
  258.  * INTRADC value
  259.  *  Int lum : indicates whether the block is a luminance block (lum=1) or
  260.  *  a chrominance block ( lum = 0)
  261.  *
  262.  * Arguments out :
  263.  * Image* bitstream  : a pointer to the output bitstream
  264.  *
  265.  ***********************************************************CommentEnd********/
  266. Int
  267. IntraDC_dpcm(Int val, Int lum, Image *bitstream)
  268. {
  269. Int n_bits;
  270. Int absval, size = 0;
  271. absval = ( val <0)?-val:val;   /* abs(val) */
  272. /* compute dct_dc_size */
  273. size = 0;
  274. while(absval)
  275. {
  276. absval>>=1;
  277. size++;
  278. }
  279. if (lum)
  280. {   /* luminance */
  281. n_bits = PutDCsize_lum (size, bitstream);
  282. }
  283. else
  284. {   /* chrominance */
  285. n_bits = PutDCsize_chrom (size, bitstream);
  286. }
  287. if ( size != 0 )
  288. {
  289. if (val>=0)
  290. {
  291. ;
  292. }
  293. else
  294. {
  295. absval = -val;   /* set to "-val" MW 14-NOV-1996 */
  296. val = (absval ^( (int)pow(2.0,(double)size)-1) );
  297. }
  298. BitstreamPutBits(bitstream, (long)(val), (long)(size));
  299. n_bits += size;
  300. if (size > 8)
  301. BitstreamPutBits(bitstream, (long)1, (long)1);
  302. }
  303. return n_bits;   /* # bits for intra_dc dpcm */
  304. }
  305. /***********************************************************CommentBegin******
  306.  *
  307.  * -- CodeCoeff -- VLC encoding of quantized DCT coefficients
  308.  *
  309.  * Purpose :
  310.  * VLC encoding of quantized DCT coefficients, except for
  311.  *      INTRADC in case of Intra macroblocks
  312.  * Used by Bits_CountCoeff
  313.  *
  314.  * Arguments in :
  315.  * Int Mode : encoding mode
  316.  *  Int *qcoeff: pointer to quantized dct coefficients
  317.  *  Int block : number of the block in the macroblock (0-5)
  318.  *  Int ncoeffs : the number of coefficients per block
  319.  *
  320.  * Arguments out :
  321.  * Image *bitstream : pointer to the output bitstream
  322.  *
  323.  * Return values :
  324.  * Int bits : number of bits added to the bitstream (?)
  325.  *
  326.  ***********************************************************CommentEnd********/
  327. Int CodeCoeff(Int j_start, Int Mode, Int qcoeff[], Int block, Int ncoeffs, Image *bitstream)
  328. {
  329. Int j, bits;
  330. Int prev_run, run, prev_level, level, first;
  331. Int prev_ind, ind, prev_s, s, length;
  332. run = bits = 0;
  333. first = 1;
  334. prev_run = prev_level = prev_ind = level = s = prev_s = ind = 0;
  335. for (j = j_start; j< ncoeffs; j++)
  336. {
  337. /* The INTRADC encoding for INTRA Macroblocks is done in
  338.    Bits_CountCoeff */
  339. {
  340. /* do not enter this part for INTRADC coding for INTRA macro-
  341.    blocks */
  342. /* encode AC coeff */
  343. s = 0;
  344. /* Increment run if coeff is zero */
  345. if ((level = qcoeff[j]) == 0)
  346. {
  347. run++;
  348. }
  349. else
  350. {
  351. /* code run & level and count bits */
  352. if (level < 0)
  353. {
  354. s = 1;
  355. level = -level;
  356. }
  357. ind = level | run<<4;
  358. ind = ind | 0<<12;   /* Not last coeff */
  359. if (!first)
  360. {
  361. /* Encode the previous ind */
  362. if ((prev_run < 64) &&
  363. (((prev_level < 13) && (Mode != MODE_INTRA &&
  364. Mode != MODE_INTRA_Q))
  365. || ((prev_level < 28) && (Mode == MODE_INTRA ||
  366. Mode == MODE_INTRA_Q))))
  367. {
  368. /* Separate tables for Intra luminance blocks */
  369. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  370. {
  371. length = PutCoeff_Intra(prev_run, prev_level,
  372. 0, bitstream);
  373. }
  374. else
  375. {
  376. length = PutCoeff_Inter(prev_run, prev_level,
  377. 0, bitstream);
  378. }
  379. }
  380. else
  381. length = 0;
  382. /* First escape mode. Level offset */
  383. if (length == 0)
  384. {
  385. if ( prev_run < 64 )
  386. {
  387. /* subtraction of Max level, last = 0 */
  388. int level_minus_max;
  389. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  390. level_minus_max = prev_level -
  391. intra_max_level[0][prev_run];
  392. else
  393. level_minus_max = prev_level -
  394. inter_max_level[0][prev_run];
  395. if (  ( (level_minus_max < 13) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q) ) ||
  396. ( (level_minus_max < 28) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) ) )
  397. {
  398. /* Separate tables for Intra luminance blocks */
  399. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  400. {
  401. length = PutLevelCoeff_Intra(prev_run, level_minus_max, 0, bitstream);
  402. }
  403. else
  404. {
  405. length = PutLevelCoeff_Inter(prev_run, level_minus_max, 0, bitstream);
  406. }
  407. } else
  408. length = 0;
  409. }
  410. else length = 0;
  411. }
  412. /* Second escape mode. Run offset */
  413. if (length == 0)
  414. {
  415. if ( ((prev_level < 13) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q)) ||
  416. ((prev_level < 28) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)) )
  417. {
  418. /* subtraction of Max Run, last = 0 */
  419. int run_minus_max;
  420. if (prev_level == 0)
  421. {
  422. fprintf (stdout, "ERROR(CodeCoeff-second esc): level is %dn", prev_level);
  423. exit(-1);
  424. }
  425. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  426. run_minus_max = prev_run - (intra_max_run0[prev_level]+1);
  427. else
  428. run_minus_max = prev_run - (inter_max_run0[prev_level]+1);
  429.   /* boon 120697 */
  430. if (run_minus_max < 64)
  431. {
  432. /* Separate tables for Intra luminance blocks */
  433. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  434. {
  435. length = PutRunCoeff_Intra(run_minus_max, prev_level, 0, bitstream);
  436. }
  437. else
  438. {
  439. length = PutRunCoeff_Inter(run_minus_max, prev_level, 0, bitstream);
  440. }
  441. } else
  442. length = 0;
  443. }
  444. else length = 0;
  445. }
  446. /* Third escape mode. FLC */
  447. if (length == 0)
  448. {   /* Escape coding */
  449. if (prev_s == 1)
  450. {
  451. /* Modified due to N2171 Cl. 2.2.14 MW 25-MAR-1998 */
  452. /* prev_level = (prev_level^0xff)+1; */
  453. prev_level = (prev_level^0xfff)+1;
  454. }
  455. BitstreamPutBits(bitstream, 3L, 7L);
  456.   /* boon */
  457. BitstreamPutBits(bitstream, 3L, 2L);
  458.   /* last */
  459. BitstreamPutBits(bitstream, 0L, 1L);
  460.   /* run */
  461. BitstreamPutBits(bitstream, (long)(prev_run), 6L);
  462. /* 11.08.98 Sven Brandau:  "insert marker_bit" due to N2339, Clause 2.1.21 */
  463. BitstreamPutBits(bitstream, MARKER_BIT, 1);
  464. /* Modified due to N2171 Cl. 2.2.14 MW 25-MAR-1998 */
  465. /* BitstreamPutBits(bitstream, (long)(prev_level), 8L); */
  466. /* bits += 24; */
  467.   /* level */
  468. BitstreamPutBits(bitstream, (long)(prev_level), 12L);
  469. /* 11.08.98 Sven Brandau:  "insert marker_bit" due to N2339, Clause 2.1.21 */
  470. BitstreamPutBits(bitstream, MARKER_BIT, 1);
  471. /*bits += 28;*/
  472. bits += 30;
  473. }
  474. else
  475. {
  476. BitstreamPutBits(bitstream, (long)(prev_s), 1L);
  477. bits += length + 1;
  478. }
  479. }
  480. prev_run = run; prev_s = s;
  481. prev_level = level; prev_ind = ind;
  482. run = first = 0;
  483. }
  484. }
  485. }
  486. /* Encode the last coeff */
  487. if (!first)
  488. {
  489. prev_ind = prev_ind | 1<<12;   /* last coeff */
  490. if ((prev_run < 64) &&
  491. (((prev_level < 4) && (Mode != MODE_INTRA &&
  492. Mode != MODE_INTRA_Q))
  493. || ((prev_level < 9) && ((Mode == MODE_INTRA) ||
  494. (Mode == MODE_INTRA_Q)))))
  495. {
  496. /* Separate tables for Intra luminance blocks */
  497. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  498. {
  499. length = PutCoeff_Intra(prev_run, prev_level, 1,
  500. bitstream);
  501. }
  502. else
  503. {
  504. length = PutCoeff_Inter(prev_run, prev_level, 1,
  505. bitstream);
  506. }
  507. }
  508. else
  509. length = 0;
  510. /* First escape mode. Level offset */
  511. if (length == 0)
  512. {
  513. if ( prev_run < 64 )
  514. {
  515. /* subtraction of Max level, last = 0 */
  516. int level_minus_max;
  517. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  518. level_minus_max = prev_level - intra_max_level[1][prev_run];
  519. else
  520. level_minus_max = prev_level - inter_max_level[1][prev_run];
  521. if (  ( (level_minus_max < 4) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q) ) ||
  522. ( (level_minus_max < 9) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) ) )
  523. {
  524. /* Separate tables for Intra luminance blocks */
  525. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  526. {
  527. length = PutLevelCoeff_Intra(prev_run, level_minus_max, 1, bitstream);
  528. }
  529. else
  530. {
  531. length = PutLevelCoeff_Inter(prev_run, level_minus_max, 1, bitstream);
  532. }
  533. } else
  534. length = 0;
  535. }
  536. else length = 0;
  537. }
  538. /* Second escape mode. Run offset */
  539. if (length == 0)
  540. {
  541. if (((prev_level < 4) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q))||
  542. ((prev_level < 9) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)) )
  543. {
  544. /* subtraction of Max Run, last = 1 */
  545. int run_minus_max;
  546. if (prev_level == 0)
  547. {
  548. fprintf (stdout, "ERROR(CodeCoeff-second esc): level is %dn", prev_level);
  549. exit(-1);
  550. }
  551. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  552. run_minus_max = prev_run - (intra_max_run1[prev_level]+1);
  553. else
  554. run_minus_max = prev_run - (inter_max_run1[prev_level]+1);
  555. if (run_minus_max < 64)   /* boon 120697 */
  556. {
  557. /* Separate tables for Intra luminance blocks */
  558. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  559. {
  560. length = PutRunCoeff_Intra(run_minus_max, prev_level, 1, bitstream);
  561. }
  562. else
  563. {
  564. length = PutRunCoeff_Inter(run_minus_max, prev_level, 1, bitstream);
  565. }
  566. } else
  567. length = 0;
  568. }
  569. else length = 0;
  570. }
  571. /* Third escape mode. FLC */
  572. if (length == 0)
  573. {   /* Escape coding */
  574. if (prev_s == 1)
  575. {
  576. /* Modified due to N2171 Cl. 2.2.14 MW 25-MAR-1998 */
  577. /* prev_level = (prev_level^0xff)+1; */
  578. prev_level = (prev_level^0xfff)+1;
  579. }
  580. BitstreamPutBits(bitstream, 3L, 7L);
  581. BitstreamPutBits(bitstream, 3L, 2L);  /* boon */
  582. BitstreamPutBits(bitstream, 1L, 1L);  /* last */
  583. BitstreamPutBits(bitstream, (long)(prev_run), 6L);
  584. /* 11.08.98 Sven Brandau:  "insert marker_bit" due to N2339, Clause 2.1.21 */
  585. BitstreamPutBits(bitstream, MARKER_BIT, 1);
  586. /* Modified due to N2171 Cl. 2.2.14 MW 25-MAR-1998 */
  587. /* BitstreamPutBits(bitstream, (long)(prev_level), 8L); */
  588. /* bits += 24; */
  589.   /* level */
  590. BitstreamPutBits(bitstream, (long)(prev_level), 12L);
  591. /* 11.08.98 Sven Brandau:  "insert marker_bit" due to N2339, Clause 2.1.21 */
  592. BitstreamPutBits(bitstream, MARKER_BIT, 1);
  593. /*bits += 28;*/
  594. bits += 30;
  595. }
  596. else
  597. {
  598. BitstreamPutBits(bitstream, (long)(prev_s), 1L);
  599. bits += length + 1;
  600. }
  601. }
  602. return bits;
  603. }
  604. /***********************************************************CommentBegin******
  605.  *
  606.  * -- CodeCoeff_RVLC -- RVLC encoding of quantized DCT coefficients
  607.  *
  608.  * Purpose :
  609.  * RVLC encoding of quantized DCT coefficients, except for
  610.  *      INTRADC in case of Intra macroblocks
  611.  *
  612.  * Arguments in :
  613.  * Int Mode : encoding mode
  614.  *  Int *qcoeff: pointer to quantized dct coefficients
  615.  *  Int block : number of the block in the macroblock (0-5)
  616.  *  Int ncoeffs : the number of coefficients per block
  617.  *
  618.  * Arguments out :
  619.  * Image *bitstream : pointer to the output bitstream
  620.  *
  621.  * Return values :
  622.  * Int bits : number of bits added to the bitstream (?)
  623.  *
  624.  ***********************************************************CommentEnd********/
  625. Int CodeCoeff_RVLC(Int j_start, Int Mode, Int qcoeff[], Int block, Int ncoeffs, Image *bitstream)
  626. {
  627. Int j, bits;
  628. Int prev_run, run, prev_level, level, first;
  629. Int prev_ind, ind, prev_s, s, length;
  630. run = bits = 0;
  631. first = 1;
  632. prev_run = prev_level = prev_ind = level = s = prev_s = ind = 0;
  633. for (j = j_start; j< ncoeffs; j++)
  634. {
  635. /* The INTRADC encoding for INTRA Macroblocks is done in
  636.    Bits_CountCoeff */
  637. {
  638. /* do not enter this part for INTRADC coding for INTRA macro-
  639.    blocks */
  640. /* encode AC coeff */
  641. s = 0;
  642. /* Increment run if coeff is zero */
  643. if ((level = qcoeff[j]) == 0)
  644. {
  645. run++;
  646. }
  647. else
  648. {
  649. /* code run & level and count bits */
  650. if (level < 0)
  651. {
  652. s = 1;
  653. level = -level;
  654. }
  655. ind = level | run<<4;
  656. ind = ind | 0<<12;   /* Not last coeff */
  657. if (!first)
  658. {
  659. /* Encode the previous ind */
  660. if (prev_level  < 28 && prev_run < 39)
  661. /* Separate tables for Intra luminance blocks */
  662. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  663. {
  664. length = PutCoeff_Intra_RVLC(prev_run, prev_level, 0,
  665. bitstream);
  666. }
  667. else
  668. {
  669. length = PutCoeff_Inter_RVLC(prev_run, prev_level, 0,
  670. bitstream);
  671. }
  672. else
  673. length = 0;
  674. if (length == 0)
  675. {   /* Escape coding */
  676.   /* ESCAPE */
  677. BitstreamPutBits(bitstream, 1L, 5L);
  678.   /* LAST   */
  679. BitstreamPutBits(bitstream, 0L, 1L);
  680. BitstreamPutBits(bitstream,
  681. (long)(prev_run), 6L);/* RUN    */
  682. /* 11.08.98 Sven Brandau:  "changed length for LEVEL (11 bit)" due to N2339, Clause 2.1.21 */
  683. /* 11.08.98 Sven Brandau:  "insert marker_bit befor and after LEVEL" due to N2339, Clause 2.1.21 */
  684. /* BitstreamPutBits(bitstream,
  685.  (long)(prev_level), 7L);*/
  686. /* LEVEL */
  687. BitstreamPutBits( bitstream, MARKER_BIT, 1 );
  688.   /* LEVEL */
  689. BitstreamPutBits( bitstream, (long)(prev_level), 11L);
  690. BitstreamPutBits( bitstream, MARKER_BIT, 1 );
  691.   /* ESCAPE */
  692. BitstreamPutBits(bitstream, 0L, 4L);
  693.   /* ESCAPE's */
  694. BitstreamPutBits(bitstream,
  695. (long)(prev_s),1L);
  696. bits += 5 + 1 + 6 + 1 + 11 + 1 + 4 + 1;
  697. /* bits += 24; */
  698. }
  699. else
  700. {
  701. BitstreamPutBits(bitstream,
  702. (long)(prev_s), 1L);
  703. bits += length + 1;
  704. }
  705. }
  706. prev_run = run; prev_s = s;
  707. prev_level = level; prev_ind = ind;
  708. run = first = 0;
  709. }
  710. }
  711. }
  712. /* Encode the last coeff */
  713. if (!first)
  714. {
  715. prev_ind = prev_ind | 1<<12;   /* last coeff */
  716. if (prev_level  < 5 && prev_run < 45)
  717. /* Separate tables for Intra luminance blocks */
  718. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  719. {
  720. length = PutCoeff_Intra_RVLC(prev_run, prev_level, 1,
  721. bitstream);
  722. }
  723. else
  724. {
  725. length = PutCoeff_Inter_RVLC(prev_run, prev_level, 1,
  726. bitstream);
  727. }
  728. else
  729. length = 0;
  730. if (length == 0)
  731. {   /* Escape coding */
  732. BitstreamPutBits(bitstream, 1L, 5L);  /* ESCAPE */
  733. BitstreamPutBits(bitstream, 1L, 1L);  /* LAST */
  734.   /* RUN */
  735. BitstreamPutBits(bitstream, (long)(prev_run), 6L);
  736. /* 11.08.98 Sven Brandau:  "changed length for LEVEL (11 bit)" due to N2339, Clause 2.1.21      */
  737. /* 11.08.98 Sven Brandau:  "insert marker_bit befor and after LEVEL" due to N2339, Clause 2.1.21 */
  738. /* BitstreamPutBits(bitstream, (long)(prev_level), 7L);*/
  739. BitstreamPutBits( bitstream, MARKER_BIT, 1 );
  740.   /* LEVEL  */
  741. BitstreamPutBits( bitstream, (long)(prev_level), 11L);
  742. BitstreamPutBits( bitstream, MARKER_BIT, 1 );
  743. BitstreamPutBits(bitstream, 0L, 4L);  /* ESCAPE  */
  744.   /* ESCAPE's  */
  745. BitstreamPutBits(bitstream, (long)(prev_s), 1L);
  746. bits += 24;
  747. }
  748. else
  749. {
  750. BitstreamPutBits(bitstream, (long)(prev_s), 1L);
  751. bits += length + 1;
  752. }
  753. }
  754. return bits;
  755. }
  756. /***********************************************************CommentBegin******
  757.  *
  758.  * -- Bits_Reset -- To reset the structure bits
  759.  *
  760.  * Purpose :
  761.  * To reset the structure bits, used for counting the number
  762.  *  of texture bits
  763.  *
  764.  * Arguments in :
  765.  * Bits* bits : a pointer to the struct Bits
  766.  *
  767.  ***********************************************************CommentEnd********/
  768. void
  769. Bits_Reset (Bits *bits)
  770. {
  771. memset(bits, 0, sizeof(Bits));
  772. }