putvlc.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.  *  putvlc.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 to code the RVLC code for bitstream. */
  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 "momusys.h"
  37. #include "vlc.h"
  38. #include "putvlc.h"
  39. #include "bitstream.h"
  40. /***********************************************************CommentBegin******
  41.  *
  42.  * -- Putxxx -- Write bits from huffman tables to file
  43.  *
  44.  * Int PutCoeff_Inter(Int run, Int level, Int last, Image *bitstream)
  45.  * Int PutCoeff_Intra(Int run, Int level, Int last, Image *bitstream)
  46.  * Int PutCBPY (Int cbpy, Int *MB_transp_pattren,Image *bitstream)
  47.  * Int PutMCBPC_Inter (Int cbpc, Int mode, Image *bitstream)
  48.  * Int PutMCBPC_Sprite (Int cbpc, Int mode, Image *bitstream)
  49.  * Int PutMCBPC_Intra (Int cbpc, Int mode, Image *bitstream)
  50.  * Int PutMV (Int mvint, Image *bitstream)
  51.  * Int PutDCsize_chrom (Int size, Image *bitstream)
  52.  * Int PutDCsize_lum (Int size, Image *bitstream)
  53.  * Int PutDCsize_lum (Int size, Image *bitstream)
  54.  *      Int PutCoeff_Inter_RVLC (Int run, Int level, Int last, Image *bitstream)
  55.  *      Int PutCoeff_Intra_RVLC (Int run, Int level, Int last, Image *bitstream)
  56.  *      Int PutRunCoeff_Inter (Int run, Int level, Int last, Image *bitstream)
  57.  *      Int PutRunCoeff_Intra (Int run, Int level, Int last, Image *bitstream)
  58.  *      Int PutLevelCoeff_Inter (Int run, Int level, Int last, Image *bitstream)
  59.  *      Int PutLevelCoeff_Intra (Int run, Int level, Int last, Image *bitstream)
  60.  *
  61.  * Purpose :
  62.  * Writes bits from huffman tables to bitstream
  63.  *
  64.  * Arguments in :
  65.  * various, see prototypes above
  66.  *
  67.  * Return values :
  68.  * Number of bits written
  69.  *
  70.  ***********************************************************CommentEnd********/
  71. Int
  72. PutDCsize_lum (Int size, Image *bitstream)
  73. {
  74. MOMCHECK(size >= 0 && size < 13);
  75. BitstreamPutBits (bitstream, DCtab_lum[size].code, DCtab_lum[size].len);
  76. return DCtab_lum[size].len;
  77. }
  78. Int
  79. PutDCsize_chrom (Int size, Image *bitstream)
  80. {
  81. MOMCHECK (size >= 0 && size < 13);
  82. BitstreamPutBits (bitstream, DCtab_chrom[size].code, DCtab_chrom[size].len);
  83. return DCtab_chrom[size].len;
  84. }
  85. Int
  86. PutMV (Int mvint, Image *bitstream)
  87. {
  88. Int sign = 0;
  89. Int absmv;
  90. if (mvint > 32)
  91. {
  92. absmv = -mvint + 65;
  93. sign = 1;
  94. }
  95. else
  96. absmv = mvint;
  97. BitstreamPutBits (bitstream, mvtab[absmv].code, mvtab[absmv].len);
  98. if (mvint != 0)
  99. {
  100. BitstreamPutBits (bitstream, sign, 1);
  101. return mvtab[absmv].len + 1;
  102. }
  103. else
  104. return mvtab[absmv].len;
  105. }
  106. Int
  107. PutMCBPC_Intra (Int cbpc, Int mode, Image *bitstream)
  108. {
  109. Int ind;
  110. ind = ((mode >> 1) & 3) | ((cbpc & 3) << 2);
  111. BitstreamPutBits (bitstream, mcbpc_intra_tab[ind].code, mcbpc_intra_tab[ind].len);
  112. return mcbpc_intra_tab[ind].len;
  113. }
  114. Int
  115. PutMCBPC_Inter (Int cbpc, Int mode, Image *bitstream)
  116. {
  117. Int ind;
  118. ind = (mode & 7) | ((cbpc & 3) << 3);
  119. BitstreamPutBits (bitstream, mcbpc_inter_tab[ind].code,
  120. mcbpc_inter_tab[ind].len);
  121. return mcbpc_inter_tab[ind].len;
  122. }
  123. Int
  124. PutMCBPC_Sprite (Int cbpc, Int mode, Image *bitstream)
  125. {
  126. Int ind;
  127. ind = (mode & 7) | ((cbpc & 3) << 3);
  128. BitstreamPutBits (bitstream, mcbpc_sprite_tab[ind].code,
  129. mcbpc_sprite_tab[ind].len);
  130. return mcbpc_sprite_tab[ind].len;
  131. }
  132. Int
  133. PutCBPY (Int cbpy, Char intra, Int *MB_transp_pattern, Image *bitstream)
  134. {
  135. Int ind;//,i,ptr;
  136. Int index=0;
  137. /* Changed due to bug report from Yoshinori Suzuki; MW 11-JUN-1998 */
  138. /* if ((intra==0)&&(index!=3)) cbpy = 15 - cbpy;  */
  139. if (intra == 0) cbpy = 15 - cbpy;
  140. ind = cbpy;
  141. BitstreamPutBits (bitstream, cbpy_tab[ind].code, cbpy_tab[ind].len);
  142. return cbpy_tab[ind].len;
  143. }
  144. Int
  145. PutCoeff_Inter(Int run, Int level, Int last, Image *bitstream)
  146. {
  147. Int length = 0;
  148. MOMCHECK (last >= 0 && last < 2);
  149. MOMCHECK (run >= 0 && run < 64);
  150. MOMCHECK (level > 0 && level < 128);
  151. if (last == 0)
  152. {
  153. if (run < 2 && level < 13 )
  154. {
  155. BitstreamPutBits (bitstream, (LInt)coeff_tab0[run][level-1].code,
  156. (LInt)coeff_tab0[run][level-1].len);
  157. length = coeff_tab0[run][level-1].len;
  158. }
  159. else if (run > 1 && run < 27 && level < 5)
  160. {
  161. BitstreamPutBits (bitstream, (LInt)coeff_tab1[run-2][level-1].code,
  162. (LInt)coeff_tab1[run-2][level-1].len);
  163. length = coeff_tab1[run-2][level-1].len;
  164. }
  165. }
  166. else if (last == 1)
  167. {
  168. if (run < 2 && level < 4)
  169. {
  170. BitstreamPutBits (bitstream, (LInt)coeff_tab2[run][level-1].code,
  171. (LInt)coeff_tab2[run][level-1].len);
  172. length = coeff_tab2[run][level-1].len;
  173. }
  174. else if (run > 1 && run < 42 && level == 1)
  175. {
  176. BitstreamPutBits (bitstream, (LInt)coeff_tab3[run-2].code,
  177. (LInt)coeff_tab3[run-2].len);
  178. length = coeff_tab3[run-2].len;
  179. }
  180. }
  181. return length;
  182. }
  183. Int
  184. PutCoeff_Intra(Int run, Int level, Int last, Image *bitstream)
  185. {
  186. Int length = 0;
  187. MOMCHECK (last >= 0 && last < 2);
  188. MOMCHECK (run >= 0 && run < 64);
  189. MOMCHECK (level > 0 && level < 128);
  190. if (last == 0)
  191. {
  192. if (run == 0 && level < 28 )
  193. {
  194. BitstreamPutBits(bitstream, (LInt)coeff_tab4[level-1].code,
  195. (LInt)coeff_tab4[level-1].len);
  196. length = coeff_tab4[level-1].len;
  197. }
  198. else if (run == 1 && level < 11)
  199. {
  200. BitstreamPutBits(bitstream, (LInt)coeff_tab5[level-1].code,
  201. (LInt)coeff_tab5[level-1].len);
  202. length = coeff_tab5[level-1].len;
  203. }
  204. else if (run > 1 && run < 10 && level < 6)
  205. {
  206. BitstreamPutBits(bitstream, (LInt)coeff_tab6[run-2][level-1].code,
  207. (LInt)coeff_tab6[run-2][level-1].len);
  208. length = coeff_tab6[run-2][level-1].len;
  209. }
  210. else if (run > 9 && run < 15 && level == 1)
  211. {
  212. BitstreamPutBits(bitstream, (LInt)coeff_tab7[run-10].code,
  213. (LInt)coeff_tab7[run-10].len);
  214. length = coeff_tab7[run-10].len;
  215. }
  216. }
  217. else if (last == 1)
  218. {
  219. if (run == 0 && level < 9)
  220. {
  221. BitstreamPutBits(bitstream, (LInt)coeff_tab8[level-1].code,
  222. (LInt)coeff_tab8[level-1].len);
  223. length = coeff_tab8[level-1].len;
  224. }
  225. else if (run > 0 && run < 7 && level < 4)
  226. {
  227. BitstreamPutBits(bitstream, (LInt)coeff_tab9[run-1][level-1].code,
  228. (LInt)coeff_tab9[run-1][level-1].len);
  229. length = coeff_tab9[run-1][level-1].len;
  230. }
  231. else if (run > 6 && run < 21 && level == 1)
  232. {
  233. BitstreamPutBits(bitstream, (LInt)coeff_tab10[run-7].code,
  234. (LInt)coeff_tab10[run-7].len);
  235. length = coeff_tab10[run-7].len;
  236. }
  237. }
  238. return length;
  239. }
  240. Int
  241. PutCoeff_Inter_RVLC(Int run, Int level, Int last, Image *bitstream)
  242. {
  243. Int length = 0;
  244. MOMCHECK (last >= 0 && last < 2);
  245. MOMCHECK (run >= 0 && run < 64);
  246. MOMCHECK (level > 0 && level < 128);
  247. if (last == 0)
  248. {
  249. if (run == 0 && level < 20 )
  250. {
  251. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab14[level-1].code,
  252. (LInt)coeff_RVLCtab14[level-1].len);
  253. length = coeff_RVLCtab14[level-1].len;
  254. }
  255. else if (run == 1 && level < 11)
  256. {
  257. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab15[level-1].code,
  258. (LInt)coeff_RVLCtab15[level-1].len);
  259. length = coeff_RVLCtab15[level-1].len;
  260. }
  261. else if (run > 1 && run < 4 && level < 8)
  262. {
  263. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab16[run-2][level-1].code,
  264. (LInt)coeff_RVLCtab16[run-2][level-1].len);
  265. length = coeff_RVLCtab16[run-2][level-1].len;
  266. }
  267. else if (run == 4 && level < 6)
  268. {
  269. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab17[level-1].code,
  270. (LInt)coeff_RVLCtab17[level-1].len);
  271. length = coeff_RVLCtab17[level-1].len;
  272. }
  273. else if (run > 4 && run < 8 && level < 5)
  274. {
  275. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab18[run-5][level-1].code,
  276. (LInt)coeff_RVLCtab18[run-5][level-1].len);
  277. length = coeff_RVLCtab18[run-5][level-1].len;
  278. }
  279. else if (run > 7 && run < 10 && level < 4)
  280. {
  281. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab19[run-8][level-1].code,
  282. (LInt)coeff_RVLCtab19[run-8][level-1].len);
  283. length = coeff_RVLCtab19[run-8][level-1].len;
  284. }
  285. else if (run > 9 && run < 18 && level < 3)
  286. {
  287. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab20[run-10][level-1].code,
  288. (LInt)coeff_RVLCtab20[run-10][level-1].len);
  289. length = coeff_RVLCtab20[run-10][level-1].len;
  290. }
  291. else if (run > 17 && run < 39 && level == 1)
  292. {
  293. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab21[run-18].code,
  294. (LInt)coeff_RVLCtab21[run-18].len);
  295. length = coeff_RVLCtab21[run-18].len;
  296. }
  297. }
  298. else if (last == 1)
  299. {
  300. if (run >= 0 && run < 2 && level < 6)
  301. {
  302. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab22[run][level-1].code,
  303. (LInt)coeff_RVLCtab22[run][level-1].len);
  304. length = coeff_RVLCtab22[run][level-1].len;
  305. }
  306. else if (run == 2 && level < 4)
  307. {
  308. BitstreamPutBits (bitstream, (LInt)coeff_RVLCtab23[level-1].code,
  309. (LInt)coeff_RVLCtab23[level-1].len);
  310. length = coeff_RVLCtab23[level-1].len;
  311. }
  312. else if (run > 2 && run < 14 && level < 3)
  313. {
  314. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab24[run-3][level-1].code,
  315. (LInt)coeff_RVLCtab24[run-3][level-1].len);
  316. length = coeff_RVLCtab24[run-3][level-1].len;
  317. }
  318. else if (run > 13 && run < 46 && level == 1)
  319. {
  320. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab25[run-14].code,
  321. (LInt)coeff_RVLCtab25[run-14].len);
  322. length = coeff_RVLCtab25[run-14].len;
  323. }
  324. }
  325. return length;
  326. }
  327. Int
  328. PutCoeff_Intra_RVLC(Int run, Int level, Int last, Image *bitstream)
  329. {
  330. Int length = 0;
  331. MOMCHECK (last >= 0 && last < 2);
  332. MOMCHECK (run >= 0 && run < 64);
  333. MOMCHECK (level > 0 && level < 128);
  334. if (last == 0)
  335. {
  336. if (run == 0 && level < 28 )
  337. {
  338. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab1[level-1].code,
  339. (LInt)coeff_RVLCtab1[level-1].len);
  340. length = coeff_RVLCtab1[level-1].len;
  341. }
  342. else if (run == 1 && level < 14)
  343. {
  344. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab2[level-1].code,
  345. (LInt)coeff_RVLCtab2[level-1].len);
  346. length = coeff_RVLCtab2[level-1].len;
  347. }
  348. else if (run == 2 && level < 12)
  349. {
  350. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab3[level-1].code,
  351. (LInt)coeff_RVLCtab3[level-1].len);
  352. length = coeff_RVLCtab3[level-1].len;
  353. }
  354. else if (run == 3 && level < 10)
  355. {
  356. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab4[level-1].code,
  357. (LInt)coeff_RVLCtab4[level-1].len);
  358. length = coeff_RVLCtab4[level-1].len;
  359. }
  360. else if (run > 3 && run < 6 && level < 7)
  361. {
  362. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab5[run-4][level-1].code,
  363. (LInt)coeff_RVLCtab5[run-4][level-1].len);
  364. length = coeff_RVLCtab5[run-4][level-1].len;
  365. }
  366. else if (run > 5 && run < 8 && level < 6)
  367. {
  368. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab6[run-6][level-1].code,
  369. (LInt)coeff_RVLCtab6[run-6][level-1].len);
  370. length = coeff_RVLCtab6[run-6][level-1].len;
  371. }
  372. else if (run > 7 && run < 10 && level < 5)
  373. {
  374. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab7[run-8][level-1].code,
  375. (LInt)coeff_RVLCtab7[run-8][level-1].len);
  376. length = coeff_RVLCtab7[run-8][level-1].len;
  377. }
  378. else if (run > 9 && run < 13 && level < 3)
  379. {
  380. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab8[run-10][level-1].code,
  381. (LInt)coeff_RVLCtab8[run-10][level-1].len);
  382. length = coeff_RVLCtab8[run-10][level-1].len;
  383. }
  384. else if (run > 12 && run < 20 && level == 1)
  385. {
  386. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab9[run-13].code,
  387. (LInt)coeff_RVLCtab9[run-13].len);
  388. length = coeff_RVLCtab9[run-13].len;
  389. }
  390. }
  391. else if (last == 1)
  392. {
  393. if (run >= 0 && run < 2 && level < 6)
  394. {
  395. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab10[run][level-1].code,
  396. (LInt)coeff_RVLCtab10[run][level-1].len);
  397. length = coeff_RVLCtab10[run][level-1].len;
  398. }
  399. else if (run == 2 && level < 4)
  400. {
  401. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab11[level-1].code,
  402. (LInt)coeff_RVLCtab11[level-1].len);
  403. length = coeff_RVLCtab11[level-1].len;
  404. }
  405. else if (run > 2 && run < 14 && level < 3)
  406. {
  407. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab12[run-3][level-1].code,
  408. (LInt)coeff_RVLCtab12[run-3][level-1].len);
  409. length = coeff_RVLCtab12[run-3][level-1].len;
  410. }
  411. else if (run > 13 && run < 46 && level == 1)
  412. {
  413. BitstreamPutBits(bitstream, (LInt)coeff_RVLCtab13[run-14].code,
  414. (LInt)coeff_RVLCtab13[run-14].len);
  415. length = coeff_RVLCtab13[run-14].len;
  416. }
  417. }
  418. return length;
  419. }
  420. /* The following is for 3-mode VLC */
  421. Int
  422. PutRunCoeff_Inter(Int run, Int level, Int last, Image *bitstream)
  423. {
  424. Int length = 0;
  425. MOMCHECK (last >= 0 && last < 2);
  426. MOMCHECK (run >= 0 && run < 64);
  427. MOMCHECK (level > 0 && level < 128);
  428. if (last == 0)
  429. {
  430. if (run < 2 && level < 13 )
  431. {
  432. length = coeff_tab0[run][level-1].len;
  433. if (length != 0)
  434. {
  435.   /* boon 120697 */
  436. BitstreamPutBits(bitstream, 3L, 7L);
  437.   /* boon 120697 */
  438. BitstreamPutBits(bitstream, 2L, 2L);
  439. length += 9;   /* boon */
  440. BitstreamPutBits (bitstream, (LInt)coeff_tab0[run][level-1].code,
  441. (LInt)coeff_tab0[run][level-1].len);
  442. }
  443. }
  444. else if (run > 1 && run < 27 && level < 5)
  445. {
  446. length = coeff_tab1[run-2][level-1].len;
  447. if (length != 0)
  448. {
  449.   /* boon 120697 */
  450. BitstreamPutBits(bitstream, 3L, 7L);
  451.   /* boon 120697 */
  452. BitstreamPutBits(bitstream, 2L, 2L);
  453. length += 9;   /* boon */
  454. BitstreamPutBits (bitstream, (LInt)coeff_tab1[run-2][level-1].code,
  455. (LInt)coeff_tab1[run-2][level-1].len);
  456. }
  457. }
  458. }
  459. else if (last == 1)
  460. {
  461. if (run < 2 && level < 4)
  462. {
  463. length = coeff_tab2[run][level-1].len;
  464. if (length != 0)
  465. {
  466.   /* boon 120697 */
  467. BitstreamPutBits(bitstream, 3L, 7L);
  468.   /* boon 120697 */
  469. BitstreamPutBits(bitstream, 2L, 2L);
  470. length += 9;   /* boon */
  471. BitstreamPutBits (bitstream, (LInt)coeff_tab2[run][level-1].code,
  472. (LInt)coeff_tab2[run][level-1].len);
  473. }
  474. }
  475. else if (run > 1 && run < 42 && level == 1)
  476. {
  477. length = coeff_tab3[run-2].len;
  478. if (length != 0)
  479. {
  480.   /* boon 120697 */
  481. BitstreamPutBits(bitstream, 3L, 7L);
  482.   /* boon 120697 */
  483. BitstreamPutBits(bitstream, 2L, 2L);
  484. length += 9;   /* boon */
  485. BitstreamPutBits (bitstream, (LInt)coeff_tab3[run-2].code,
  486. (LInt)coeff_tab3[run-2].len);
  487. }
  488. }
  489. }
  490. return length;
  491. }
  492. Int
  493. PutRunCoeff_Intra(Int run, Int level, Int last, Image *bitstream)
  494. {
  495. Int length = 0;
  496. MOMCHECK (last >= 0 && last < 2);
  497. MOMCHECK (run >= 0 && run < 64);
  498. MOMCHECK (level > 0 && level < 128);
  499. if (last == 0)
  500. {
  501. if (run == 0 && level < 28 )
  502. {
  503. length = coeff_tab4[level-1].len;
  504. if (length != 0)
  505. {
  506.   /* boon 120697 */
  507. BitstreamPutBits(bitstream, 3L, 7L);
  508.   /* boon 120697 */
  509. BitstreamPutBits(bitstream, 2L, 2L);
  510. length += 9;   /* boon */
  511. BitstreamPutBits(bitstream, (LInt)coeff_tab4[level-1].code,
  512. (LInt)coeff_tab4[level-1].len);
  513. }
  514. }
  515. else if (run == 1 && level < 11)
  516. {
  517. length = coeff_tab5[level-1].len;
  518. if (length != 0)
  519. {
  520.   /* boon 120697 */
  521. BitstreamPutBits(bitstream, 3L, 7L);
  522.   /* boon 120697 */
  523. BitstreamPutBits(bitstream, 2L, 2L);
  524. length += 9;   /* boon */
  525. BitstreamPutBits(bitstream, (LInt)coeff_tab5[level-1].code,
  526. (LInt)coeff_tab5[level-1].len);
  527. }
  528. }
  529. else if (run > 1 && run < 10 && level < 6)
  530. {
  531. length = coeff_tab6[run-2][level-1].len;
  532. if (length != 0)
  533. {
  534.   /* boon 120697 */
  535. BitstreamPutBits(bitstream, 3L, 7L);
  536.   /* boon 120697 */
  537. BitstreamPutBits(bitstream, 2L, 2L);
  538. length += 9;   /* boon */
  539. BitstreamPutBits(bitstream, (LInt)coeff_tab6[run-2][level-1].code,
  540. (LInt)coeff_tab6[run-2][level-1].len);
  541. }
  542. }
  543. else if (run > 9 && run < 15 && level == 1)
  544. {
  545. length = coeff_tab7[run-10].len;
  546. if (length != 0)
  547. {
  548.   /* boon 120697 */
  549. BitstreamPutBits(bitstream, 3L, 7L);
  550.   /* boon 120697 */
  551. BitstreamPutBits(bitstream, 2L, 2L);
  552. length += 9;   /* boon */
  553. BitstreamPutBits(bitstream, (LInt)coeff_tab7[run-10].code,
  554. (LInt)coeff_tab7[run-10].len);
  555. }
  556. }
  557. }
  558. else if (last == 1)
  559. {
  560. if (run == 0 && level < 9)
  561. {
  562. length = coeff_tab8[level-1].len;
  563. if (length != 0)
  564. {
  565.   /* boon 120697 */
  566. BitstreamPutBits(bitstream, 3L, 7L);
  567.   /* boon 120697 */
  568. BitstreamPutBits(bitstream, 2L, 2L);
  569. length += 9;   /* boon */
  570. BitstreamPutBits(bitstream, (LInt)coeff_tab8[level-1].code,
  571. (LInt)coeff_tab8[level-1].len);
  572. }
  573. }
  574. else if (run > 0 && run < 7 && level < 4)
  575. {
  576. length = coeff_tab9[run-1][level-1].len;
  577. if (length != 0)
  578. {
  579.   /* boon 120697 */
  580. BitstreamPutBits(bitstream, 3L, 7L);
  581.   /* boon 120697 */
  582. BitstreamPutBits(bitstream, 2L, 2L);
  583. length += 9;   /* boon */
  584. BitstreamPutBits(bitstream, (LInt)coeff_tab9[run-1][level-1].code,
  585. (LInt)coeff_tab9[run-1][level-1].len);
  586. }
  587. }
  588. else if (run > 6 && run < 21 && level == 1)
  589. {
  590. length = coeff_tab10[run-7].len;
  591. if (length != 0)
  592. {
  593.   /* boon 120697 */
  594. BitstreamPutBits(bitstream, 3L, 7L);
  595.   /* boon 120697 */
  596. BitstreamPutBits(bitstream, 2L, 2L);
  597. length += 9;   /* boon */
  598. BitstreamPutBits(bitstream, (LInt)coeff_tab10[run-7].code,
  599. (LInt)coeff_tab10[run-7].len);
  600. }
  601. }
  602. }
  603. return length;
  604. }
  605. Int
  606. PutLevelCoeff_Inter(Int run, Int level, Int last, Image *bitstream)
  607. {
  608. Int length = 0;
  609. MOMCHECK (last >= 0 && last < 2);
  610. MOMCHECK (run >= 0 && run < 64);
  611. MOMCHECK (level > 0 && level < 128);
  612. if (last == 0)
  613. {
  614. if (run < 2 && level < 13 )
  615. {
  616. length = coeff_tab0[run][level-1].len;
  617. if (length != 0)
  618. {
  619. BitstreamPutBits(bitstream, 3L, 7L);
  620.   /* boon19970701 */
  621. BitstreamPutBits(bitstream, 0L, 1L);
  622. length += 8;   /* boon */
  623. BitstreamPutBits (bitstream, (LInt)coeff_tab0[run][level-1].code,
  624. (LInt)coeff_tab0[run][level-1].len);
  625. }
  626. }
  627. else if (run > 1 && run < 27 && level < 5)
  628. {
  629. length = coeff_tab1[run-2][level-1].len;
  630. if (length != 0)
  631. {
  632. BitstreamPutBits(bitstream, 3L, 7L);
  633.   /* boon19970701 */
  634. BitstreamPutBits(bitstream, 0L, 1L);
  635. length += 8;   /* boon */
  636. BitstreamPutBits (bitstream, (LInt)coeff_tab1[run-2][level-1].code,
  637. (LInt)coeff_tab1[run-2][level-1].len);
  638. }
  639. }
  640. }
  641. else if (last == 1)
  642. {
  643. if (run < 2 && level < 4)
  644. {
  645. length = coeff_tab2[run][level-1].len;
  646. if (length != 0)
  647. {
  648. BitstreamPutBits(bitstream, 3L, 7L);
  649.   /* boon19970701 */
  650. BitstreamPutBits(bitstream, 0L, 1L);
  651. length += 8;   /* boon */
  652. BitstreamPutBits (bitstream, (LInt)coeff_tab2[run][level-1].code,
  653. (LInt)coeff_tab2[run][level-1].len);
  654. }
  655. }
  656. else if (run > 1 && run < 42 && level == 1)
  657. {
  658. length = coeff_tab3[run-2].len;
  659. if (length != 0)
  660. {
  661. BitstreamPutBits(bitstream, 3L, 7L);
  662.   /* boon19970701 */
  663. BitstreamPutBits(bitstream, 0L, 1L);
  664. length += 8;   /* boon */
  665. BitstreamPutBits (bitstream, (LInt)coeff_tab3[run-2].code,
  666. (LInt)coeff_tab3[run-2].len);
  667. }
  668. }
  669. }
  670. return length;
  671. }
  672. Int
  673. PutLevelCoeff_Intra(Int run, Int level, Int last, Image *bitstream)
  674. {
  675. Int length = 0;
  676. MOMCHECK (last >= 0 && last < 2);
  677. MOMCHECK (run >= 0 && run < 64);
  678. MOMCHECK (level > 0 && level < 128);
  679. if (last == 0)
  680. {
  681. if (run == 0 && level < 28 )
  682. {
  683. length = coeff_tab4[level-1].len;
  684. if (length != 0)
  685. {
  686. BitstreamPutBits(bitstream, 3L, 7L);
  687.   /* boon19970701 */
  688. BitstreamPutBits(bitstream, 0L, 1L);
  689. length += 8;   /* boon */
  690. BitstreamPutBits(bitstream, (LInt)coeff_tab4[level-1].code,
  691. (LInt)coeff_tab4[level-1].len);
  692. }
  693. }
  694. else if (run == 1 && level < 11)
  695. {
  696. length = coeff_tab5[level-1].len;
  697. if (length != 0)
  698. {
  699. BitstreamPutBits(bitstream, 3L, 7L);
  700.   /* boon19970701 */
  701. BitstreamPutBits(bitstream, 0L, 1L);
  702. length += 8;   /* boon */
  703. BitstreamPutBits(bitstream, (LInt)coeff_tab5[level-1].code,
  704. (LInt)coeff_tab5[level-1].len);
  705. }
  706. }
  707. else if (run > 1 && run < 10 && level < 6)
  708. {
  709. length = coeff_tab6[run-2][level-1].len;
  710. if (length != 0)
  711. {
  712. BitstreamPutBits(bitstream, 3L, 7L);
  713.   /* boon19970701 */
  714. BitstreamPutBits(bitstream, 0L, 1L);
  715. length += 8;   /* boon */
  716. BitstreamPutBits(bitstream, (LInt)coeff_tab6[run-2][level-1].code,
  717. (LInt)coeff_tab6[run-2][level-1].len);
  718. }
  719. }
  720. else if (run > 9 && run < 15 && level == 1)
  721. {
  722. length = coeff_tab7[run-10].len;
  723. if (length != 0)
  724. {
  725. BitstreamPutBits(bitstream, 3L, 7L);
  726.   /* boon19970701 */
  727. BitstreamPutBits(bitstream, 0L, 1L);
  728. length += 8;   /* boon */
  729. BitstreamPutBits(bitstream, (LInt)coeff_tab7[run-10].code,
  730. (LInt)coeff_tab7[run-10].len);
  731. }
  732. }
  733. }
  734. else if (last == 1)
  735. {
  736. if (run == 0 && level < 9)
  737. {
  738. length = coeff_tab8[level-1].len;
  739. if (length != 0)
  740. {
  741. BitstreamPutBits(bitstream, 3L, 7L);
  742.   /* boon19970701 */
  743. BitstreamPutBits(bitstream, 0L, 1L);
  744. length += 8;   /* boon */
  745. BitstreamPutBits(bitstream, (LInt)coeff_tab8[level-1].code,
  746. (LInt)coeff_tab8[level-1].len);
  747. }
  748. }
  749. else if (run > 0 && run < 7 && level < 4)
  750. {
  751. length = coeff_tab9[run-1][level-1].len;
  752. if (length != 0)
  753. {
  754. BitstreamPutBits(bitstream, 3L, 7L);
  755.   /* boon19970701 */
  756. BitstreamPutBits(bitstream, 0L, 1L);
  757. length += 8;   /* boon */
  758. BitstreamPutBits(bitstream, (LInt)coeff_tab9[run-1][level-1].code,
  759. (LInt)coeff_tab9[run-1][level-1].len);
  760. }
  761. }
  762. else if (run > 6 && run < 21 && level == 1)
  763. {
  764. length = coeff_tab10[run-7].len;
  765. if (length != 0)
  766. {
  767. BitstreamPutBits(bitstream, 3L, 7L);
  768.   /* boon19970701 */
  769. BitstreamPutBits(bitstream, 0L, 1L);
  770. length += 8;   /* boon */
  771. BitstreamPutBits(bitstream, (LInt)coeff_tab10[run-7].code,
  772. (LInt)coeff_tab10[run-7].len);
  773. }
  774. }
  775. }
  776. return length;
  777. }