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

多媒体编程

开发平台:

Visual C++

  1. #include "momusys.h"
  2. #include "text_defs.h"
  3. #include "bitstream.h"
  4. #include "text_bits.h"
  5. #include "putvlc.h"
  6. #include "zigzag.h"   
  7. #include "max_level.h"   
  8. Int   IntraDC_dpcm (Int val, Int lum, Image *bitstream);
  9. Int   CodeCoeff (Int j_start, Int Mode, Int qcoeff[],
  10. Int block, Int ncoeffs, Image *bitstream);
  11. Int   CodeCoeff_RVLC (Int j_start, Int Mode, Int qcoeff[],
  12. Int block, Int ncoeffs, Image *bitstream);
  13. Void MB_CodeCoeff(Bits* bits, Int *qcoeff,
  14. Int Mode, Int CBP, Int ncoeffs,
  15. Int intra_dcpred_disable,
  16. Image *DCbitstream,
  17. Image *bitstream,
  18. Int transp_pattern[], Int direction[],
  19. Int error_res_disable,
  20. Int reverse_vlc,
  21. Int switched,
  22. Int alternate_scan)
  23. {
  24. Int i, m, coeff[64];
  25. Int *zz = alternate_scan ? zigzag_v : zigzag;
  26. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  27. {
  28. if (intra_dcpred_disable == 0)
  29. {
  30. for (i = 0; i < 6; i++)
  31. {
  32. {
  33. if (!alternate_scan)
  34. {
  35. switch (direction[i])
  36. {
  37. case 1: zz = zigzag_v; break;
  38. case 2: zz = zigzag_h; break;
  39. case 0: break;
  40. default: fprintf(stderr, "MB_CodeCoeff(): Error in zigzag directionn");
  41. exit(-1);
  42. }
  43. }
  44. for (m = 0; m < 64; m++)
  45. {
  46. *(coeff + zz[m]) = qcoeff[i*ncoeffs+m];
  47. }
  48. if (switched==0)
  49. {
  50. if (error_res_disable)
  51. {
  52. if (i < 4)
  53. bits->Y += IntraDC_dpcm(coeff[0],1,bitstream);
  54. else
  55. bits->C += IntraDC_dpcm(coeff[0],0,bitstream);
  56. }
  57. else
  58. {
  59. if (i < 4)
  60. bits->Y += IntraDC_dpcm(coeff[0],1,DCbitstream);
  61. else
  62. bits->C += IntraDC_dpcm(coeff[0],0,DCbitstream);
  63. }
  64. }
  65. if ((i==0 && CBP&32) ||
  66. (i==1 && CBP&16) ||
  67. (i==2 && CBP&8)  ||
  68. (i==3 && CBP&4)  ||
  69. (i==4 && CBP&2)  ||
  70. (i==5 && CBP&1))
  71. {
  72. if (error_res_disable || ((!error_res_disable) && (!reverse_vlc)))
  73. {
  74. if (i < 4)
  75. bits->Y += CodeCoeff(1-switched,Mode, coeff,i,ncoeffs,bitstream);
  76. else
  77. bits->C += CodeCoeff(1-switched,Mode, coeff,i,ncoeffs,
  78. bitstream);
  79. }
  80. else
  81. {
  82. if (i < 4)
  83. bits->Y += CodeCoeff_RVLC(1-switched,Mode, coeff, i,
  84. ncoeffs, bitstream);
  85. else
  86. bits->C += CodeCoeff_RVLC(1-switched,Mode, coeff, i,
  87. ncoeffs, bitstream);
  88. }
  89. }
  90. }
  91. }
  92. }
  93. else   
  94. {
  95. for (i = 0; i < 6; i++)
  96. {
  97. {
  98. for (m = 0; m < 64; m++)
  99. *(coeff + zz[m]) = qcoeff[i*ncoeffs+m];
  100. if (switched==0)
  101. {
  102. if (error_res_disable)
  103. {
  104. if (coeff[0] != 128)
  105. BitstreamPutBits(bitstream,(long)(coeff[0]),8L);
  106. else
  107. BitstreamPutBits(bitstream, 255L, 8L);
  108. }
  109. else
  110. {
  111. if (coeff[0] != 128)
  112. BitstreamPutBits(DCbitstream,(long)(coeff[0]),8L);
  113. else
  114. BitstreamPutBits(DCbitstream,255L, 8L);
  115. }
  116. if (i < 4)
  117. bits->Y += 8;
  118. else
  119. bits->C += 8;
  120. }
  121. if ((i==0 && CBP&32) || (i==1 && CBP&16) ||
  122. (i==2 && CBP&8) || (i==3 && CBP&4) ||
  123. (i==4 && CBP&2) || (i==5 && CBP&1))
  124. {
  125. if (error_res_disable || ((!error_res_disable) && (!reverse_vlc)))
  126. {
  127. if (i < 4)
  128. bits->Y += CodeCoeff(1-switched,Mode, coeff,i,ncoeffs,
  129. bitstream);
  130. else
  131. bits->C += CodeCoeff(1-switched,Mode, coeff,i,ncoeffs,
  132. bitstream);
  133. }
  134. else
  135. {
  136. if (i < 4)
  137. bits->Y += CodeCoeff_RVLC(1-switched,Mode, coeff, i,
  138. ncoeffs, bitstream);
  139. else
  140. bits->C += CodeCoeff_RVLC(1-switched,Mode, coeff, i,
  141. ncoeffs, bitstream);
  142. }
  143. }
  144. }
  145. }
  146. }
  147. }
  148. else   
  149. {
  150. for (i = 0; i < 6; i++)
  151. {
  152. for (m = 0; m < 64; m++)
  153. *(coeff + zz[m]) = qcoeff[i*ncoeffs+m];
  154. if ((i==0 && CBP&32) ||
  155. (i==1 && CBP&16) ||
  156. (i==2 && CBP&8) ||
  157. (i==3 && CBP&4) ||
  158. (i==4 && CBP&2) ||
  159. (i==5 && CBP&1))
  160. {
  161. if (error_res_disable || ((!error_res_disable) && (!reverse_vlc)))
  162. {
  163. if (i < 4)
  164. bits->Y += CodeCoeff(0,Mode, coeff, i, ncoeffs, bitstream);
  165. else
  166. bits->C += CodeCoeff(0,Mode, coeff, i, ncoeffs, bitstream);
  167. }
  168. else
  169. {
  170. if (i < 4)
  171. bits->Y += CodeCoeff_RVLC(0,Mode, coeff, i, ncoeffs,
  172. bitstream);
  173. else
  174. bits->C += CodeCoeff_RVLC(0,Mode, coeff, i, ncoeffs,
  175. bitstream);
  176. }
  177. }
  178. }
  179. }
  180. }
  181. Int
  182. IntraDC_dpcm(Int val, Int lum, Image *bitstream)
  183. {
  184. Int n_bits;
  185. Int absval, size = 0;
  186. absval = ( val <0)?-val:val;   
  187. size = 0;
  188. while(absval)
  189. {
  190. absval>>=1;
  191. size++;
  192. }
  193. if (lum)
  194. {   
  195. n_bits = PutDCsize_lum (size, bitstream);
  196. }
  197. else
  198. {   
  199. n_bits = PutDCsize_chrom (size, bitstream);
  200. }
  201. if ( size != 0 )
  202. {
  203. if (val>=0)
  204. {
  205. ;
  206. }
  207. else
  208. {
  209. absval = -val;   
  210. val = (absval ^( (int)pow(2.0,(double)size)-1) );
  211. }
  212. BitstreamPutBits(bitstream, (long)(val), (long)(size));
  213. n_bits += size;
  214. if (size > 8)
  215. BitstreamPutBits(bitstream, (long)1, (long)1);
  216. }
  217. return n_bits;   
  218. }
  219. Int CodeCoeff(Int j_start, Int Mode, Int qcoeff[], Int block, Int ncoeffs, Image *bitstream)
  220. {
  221. Int j, bits;
  222. Int prev_run, run, prev_level, level, first;
  223. Int prev_ind, ind, prev_s, s, length;
  224. run = bits = 0;
  225. first = 1;
  226. prev_run = prev_level = prev_ind = level = s = prev_s = ind = 0;
  227. for (j = j_start; j< ncoeffs; j++)
  228. {
  229. {
  230. s = 0;
  231. if ((level = qcoeff[j]) == 0)
  232. {
  233. run++;
  234. }
  235. else
  236. {
  237. if (level < 0)
  238. {
  239. s = 1;
  240. level = -level;
  241. }
  242. ind = level | run<<4;
  243. ind = ind | 0<<12;   
  244. if (!first)
  245. {
  246. if ((prev_run < 64) &&
  247. (((prev_level < 13) && (Mode != MODE_INTRA &&
  248. Mode != MODE_INTRA_Q))
  249. || ((prev_level < 28) && (Mode == MODE_INTRA ||
  250. Mode == MODE_INTRA_Q))))
  251. {
  252. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  253. {
  254. length = PutCoeff_Intra(prev_run, prev_level,
  255. 0, bitstream);
  256. }
  257. else
  258. {
  259. length = PutCoeff_Inter(prev_run, prev_level,
  260. 0, bitstream);
  261. }
  262. }
  263. else
  264. length = 0;
  265. if (length == 0)
  266. {
  267. if ( prev_run < 64 )
  268. {
  269. int level_minus_max;
  270. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  271. level_minus_max = prev_level -
  272. intra_max_level[0][prev_run];
  273. else
  274. level_minus_max = prev_level -
  275. inter_max_level[0][prev_run];
  276. if (  ( (level_minus_max < 13) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q) ) ||
  277. ( (level_minus_max < 28) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) ) )
  278. {
  279. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  280. {
  281. length = PutLevelCoeff_Intra(prev_run, level_minus_max, 0, bitstream);
  282. }
  283. else
  284. {
  285. length = PutLevelCoeff_Inter(prev_run, level_minus_max, 0, bitstream);
  286. }
  287. } else
  288. length = 0;
  289. }
  290. else length = 0;
  291. }
  292. if (length == 0)
  293. {
  294. if ( ((prev_level < 13) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q)) ||
  295. ((prev_level < 28) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)) )
  296. {
  297. int run_minus_max;
  298. if (prev_level == 0)
  299. {
  300. fprintf (stdout, "ERROR(CodeCoeff-second esc): level is %dn", prev_level);
  301. exit(-1);
  302. }
  303. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  304. run_minus_max = prev_run - (intra_max_run0[prev_level]+1);
  305. else
  306. run_minus_max = prev_run - (inter_max_run0[prev_level]+1);
  307.   
  308. if (run_minus_max < 64)
  309. {
  310. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  311. {
  312. length = PutRunCoeff_Intra(run_minus_max, prev_level, 0, bitstream);
  313. }
  314. else
  315. {
  316. length = PutRunCoeff_Inter(run_minus_max, prev_level, 0, bitstream);
  317. }
  318. } else
  319. length = 0;
  320. }
  321. else length = 0;
  322. }
  323. if (length == 0)
  324. {   
  325. if (prev_s == 1)
  326. {
  327. prev_level = (prev_level^0xfff)+1;
  328. }
  329. BitstreamPutBits(bitstream, 3L, 7L);
  330.   
  331. BitstreamPutBits(bitstream, 3L, 2L);
  332.   
  333. BitstreamPutBits(bitstream, 0L, 1L);
  334.   
  335. BitstreamPutBits(bitstream, (long)(prev_run), 6L);
  336. BitstreamPutBits(bitstream, MARKER_BIT, 1);
  337.   
  338. BitstreamPutBits(bitstream, (long)(prev_level), 12L);
  339. BitstreamPutBits(bitstream, MARKER_BIT, 1);
  340. bits += 30;
  341. }
  342. else
  343. {
  344. BitstreamPutBits(bitstream, (long)(prev_s), 1L);
  345. bits += length + 1;
  346. }
  347. }
  348. prev_run = run; prev_s = s;
  349. prev_level = level; prev_ind = ind;
  350. run = first = 0;
  351. }
  352. }
  353. }
  354. if (!first)
  355. {
  356. prev_ind = prev_ind | 1<<12;   
  357. if ((prev_run < 64) &&
  358. (((prev_level < 4) && (Mode != MODE_INTRA &&
  359. Mode != MODE_INTRA_Q))
  360. || ((prev_level < 9) && ((Mode == MODE_INTRA) ||
  361. (Mode == MODE_INTRA_Q)))))
  362. {
  363. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  364. {
  365. length = PutCoeff_Intra(prev_run, prev_level, 1,
  366. bitstream);
  367. }
  368. else
  369. {
  370. length = PutCoeff_Inter(prev_run, prev_level, 1,
  371. bitstream);
  372. }
  373. }
  374. else
  375. length = 0;
  376. if (length == 0)
  377. {
  378. if ( prev_run < 64 )
  379. {
  380. int level_minus_max;
  381. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  382. level_minus_max = prev_level - intra_max_level[1][prev_run];
  383. else
  384. level_minus_max = prev_level - inter_max_level[1][prev_run];
  385. if (  ( (level_minus_max < 4) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q) ) ||
  386. ( (level_minus_max < 9) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) ) )
  387. {
  388. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  389. {
  390. length = PutLevelCoeff_Intra(prev_run, level_minus_max, 1, bitstream);
  391. }
  392. else
  393. {
  394. length = PutLevelCoeff_Inter(prev_run, level_minus_max, 1, bitstream);
  395. }
  396. } else
  397. length = 0;
  398. }
  399. else length = 0;
  400. }
  401. if (length == 0)
  402. {
  403. if (((prev_level < 4) && (Mode != MODE_INTRA && Mode != MODE_INTRA_Q))||
  404. ((prev_level < 9) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)) )
  405. {
  406. int run_minus_max;
  407. if (prev_level == 0)
  408. {
  409. fprintf (stdout, "ERROR(CodeCoeff-second esc): level is %dn", prev_level);
  410. exit(-1);
  411. }
  412. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  413. run_minus_max = prev_run - (intra_max_run1[prev_level]+1);
  414. else
  415. run_minus_max = prev_run - (inter_max_run1[prev_level]+1);
  416. if (run_minus_max < 64)   
  417. {
  418. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  419. {
  420. length = PutRunCoeff_Intra(run_minus_max, prev_level, 1, bitstream);
  421. }
  422. else
  423. {
  424. length = PutRunCoeff_Inter(run_minus_max, prev_level, 1, bitstream);
  425. }
  426. } else
  427. length = 0;
  428. }
  429. else length = 0;
  430. }
  431. if (length == 0)
  432. {   
  433. if (prev_s == 1)
  434. {
  435. prev_level = (prev_level^0xfff)+1;
  436. }
  437. BitstreamPutBits(bitstream, 3L, 7L);
  438. BitstreamPutBits(bitstream, 3L, 2L);  
  439. BitstreamPutBits(bitstream, 1L, 1L);  
  440. BitstreamPutBits(bitstream, (long)(prev_run), 6L);
  441. BitstreamPutBits(bitstream, MARKER_BIT, 1);
  442.   
  443. BitstreamPutBits(bitstream, (long)(prev_level), 12L);
  444. BitstreamPutBits(bitstream, MARKER_BIT, 1);
  445. bits += 30;
  446. }
  447. else
  448. {
  449. BitstreamPutBits(bitstream, (long)(prev_s), 1L);
  450. bits += length + 1;
  451. }
  452. }
  453. return bits;
  454. }
  455. Int CodeCoeff_RVLC(Int j_start, Int Mode, Int qcoeff[], Int block, Int ncoeffs, Image *bitstream)
  456. {
  457. Int j, bits;
  458. Int prev_run, run, prev_level, level, first;
  459. Int prev_ind, ind, prev_s, s, length;
  460. run = bits = 0;
  461. first = 1;
  462. prev_run = prev_level = prev_ind = level = s = prev_s = ind = 0;
  463. for (j = j_start; j< ncoeffs; j++)
  464. {
  465. {
  466. s = 0;
  467. if ((level = qcoeff[j]) == 0)
  468. {
  469. run++;
  470. }
  471. else
  472. {
  473. if (level < 0)
  474. {
  475. s = 1;
  476. level = -level;
  477. }
  478. ind = level | run<<4;
  479. ind = ind | 0<<12;   
  480. if (!first)
  481. {
  482. if (prev_level  < 28 && prev_run < 39)
  483. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  484. {
  485. length = PutCoeff_Intra_RVLC(prev_run, prev_level, 0,
  486. bitstream);
  487. }
  488. else
  489. {
  490. length = PutCoeff_Inter_RVLC(prev_run, prev_level, 0,
  491. bitstream);
  492. }
  493. else
  494. length = 0;
  495. if (length == 0)
  496. {   
  497.   
  498. BitstreamPutBits(bitstream, 1L, 5L);
  499.   
  500. BitstreamPutBits(bitstream, 0L, 1L);
  501. BitstreamPutBits(bitstream,
  502. (long)(prev_run), 6L);
  503. BitstreamPutBits( bitstream, MARKER_BIT, 1 );
  504.   
  505. BitstreamPutBits( bitstream, (long)(prev_level), 11L);
  506. BitstreamPutBits( bitstream, MARKER_BIT, 1 );
  507.   
  508. BitstreamPutBits(bitstream, 0L, 4L);
  509.   
  510. BitstreamPutBits(bitstream,
  511. (long)(prev_s),1L);
  512. bits += 5 + 1 + 6 + 1 + 11 + 1 + 4 + 1;
  513. }
  514. else
  515. {
  516. BitstreamPutBits(bitstream,
  517. (long)(prev_s), 1L);
  518. bits += length + 1;
  519. }
  520. }
  521. prev_run = run; prev_s = s;
  522. prev_level = level; prev_ind = ind;
  523. run = first = 0;
  524. }
  525. }
  526. }
  527. if (!first)
  528. {
  529. prev_ind = prev_ind | 1<<12;   
  530. if (prev_level  < 5 && prev_run < 45)
  531. if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
  532. {
  533. length = PutCoeff_Intra_RVLC(prev_run, prev_level, 1,
  534. bitstream);
  535. }
  536. else
  537. {
  538. length = PutCoeff_Inter_RVLC(prev_run, prev_level, 1,
  539. bitstream);
  540. }
  541. else
  542. length = 0;
  543. if (length == 0)
  544. {   
  545. BitstreamPutBits(bitstream, 1L, 5L);  
  546. BitstreamPutBits(bitstream, 1L, 1L);  
  547.   
  548. BitstreamPutBits(bitstream, (long)(prev_run), 6L);
  549. BitstreamPutBits( bitstream, MARKER_BIT, 1 );
  550.   
  551. BitstreamPutBits( bitstream, (long)(prev_level), 11L);
  552. BitstreamPutBits( bitstream, MARKER_BIT, 1 );
  553. BitstreamPutBits(bitstream, 0L, 4L);  
  554.   
  555. BitstreamPutBits(bitstream, (long)(prev_s), 1L);
  556. bits += 24;
  557. }
  558. else
  559. {
  560. BitstreamPutBits(bitstream, (long)(prev_s), 1L);
  561. bits += length + 1;
  562. }
  563. }
  564. return bits;
  565. }
  566. void
  567. Bits_Reset (Bits *bits)
  568. {
  569. memset(bits, 0, sizeof(Bits));
  570. }