mp4_block.c
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:8k
源码类别:

VC书籍

开发平台:

Visual C++

  1. #include <math.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include "mp4_vars.h"
  5. #include "getbits.h"
  6. #include "clearblock.h"
  7. #include "mp4_iquant.h"
  8. #include "mp4_predict.h"
  9. #include "mp4_vld.h"
  10. #include "debug.h"
  11. #include "mp4_block.h"
  12. /**
  13.  *
  14. **/
  15. static int getDCsizeLum();
  16. static int getDCsizeChr();
  17. static int getDCdiff();
  18. static void setDCscaler(int block_num);
  19. static int getACdir();
  20. /***/
  21. int block(int block_num, int coded)
  22. {
  23. int i;
  24. int dct_dc_size, dct_dc_diff;
  25. int intraFlag = ((mp4_state->hdr.derived_mb_type == INTRA) || 
  26. (mp4_state->hdr.derived_mb_type == INTRA_Q)) ? 1 : 0;
  27. event_t event;
  28. clearblock(ld->block); 
  29. if (intraFlag)
  30. {
  31. setDCscaler(block_num); 
  32. if (block_num < 4) {
  33. dct_dc_size = getDCsizeLum();
  34. if (dct_dc_size != 0) 
  35. dct_dc_diff = getDCdiff(dct_dc_size);
  36. else 
  37. dct_dc_diff = 0;
  38. if (dct_dc_size > 8)
  39. getbits1(); 
  40. }
  41. else {
  42. dct_dc_size = getDCsizeChr();
  43. if (dct_dc_size != 0)
  44. dct_dc_diff = getDCdiff(dct_dc_size);
  45. else 
  46. dct_dc_diff = 0;
  47. if (dct_dc_size > 8)
  48. getbits1(); 
  49. }
  50. ld->block[0] = (short) dct_dc_diff;
  51. }
  52. if (intraFlag)
  53. {
  54. dc_recon(block_num, &ld->block[0]);
  55. }
  56. if (coded) 
  57. {
  58. unsigned int * zigzag;
  59. if ((intraFlag) && (mp4_state->hdr.ac_pred_flag == 1)) {
  60. if (mp4_state->coeff_pred.predict_dir == TOP)
  61. zigzag = mp4_tables->alternate_horizontal_scan;
  62. else
  63. zigzag = mp4_tables->alternate_vertical_scan;
  64. }
  65. else {
  66. zigzag = mp4_tables->zig_zag_scan;
  67. }
  68. i = intraFlag ? 1 : 0;
  69. do 
  70. {
  71. event = vld_event(intraFlag);
  72. i+= event.run;
  73. ld->block[zigzag[i]] = (short) event.level;
  74. i++;
  75. } while (! event.last);
  76. }
  77. if (intraFlag)
  78. {
  79. ac_recon(block_num, &ld->block[0]);
  80. }
  81. #ifdef _DEBUG_B_ACDC
  82. if (intraFlag)
  83. {
  84. int i;
  85. _Print("After AcDcRecon:n");
  86. _Print("   x ");
  87. for (i = 1; i < 64; i++) {
  88. if ((i != 0) && ((i % 8) == 0))
  89. _Print("n");
  90. _Print("%4d ", ld->block[i]);
  91. }
  92. _Print("n");
  93. }
  94. #endif // _DEBUG_ACDC
  95. if (mp4_state->hdr.quant_type == 0)
  96. {
  97. iquant(ld->block, intraFlag);
  98. }
  99. else 
  100. {
  101. _Error("Error: MPEG-2 inverse quantization NOT implementedn");
  102. exit(110);
  103. }
  104. #ifdef _DEBUG_B_QUANT
  105. {
  106. int i;
  107. _Print("After IQuant:n");
  108. _Print("   x ");
  109. for (i = 1; i < 64; i++) {
  110. if ((i != 0) && ((i % 8) == 0))
  111. _Print("n");
  112. _Print("%4d ", ld->block[i]);
  113. }
  114. _Print("n");
  115. }
  116. #endif 
  117. idct(ld->block);
  118. return 1;
  119. }
  120. /***/
  121. int blockIntra(int block_num, int coded)
  122. {
  123. int i;
  124. int dct_dc_size, dct_dc_diff;
  125. event_t event;
  126. clearblock(ld->block); 
  127. setDCscaler(block_num); 
  128. if (block_num < 4) {
  129. dct_dc_size = getDCsizeLum();
  130. if (dct_dc_size != 0) 
  131. dct_dc_diff = getDCdiff(dct_dc_size);
  132. else 
  133. dct_dc_diff = 0;
  134. if (dct_dc_size > 8)
  135. getbits1(); 
  136. }
  137. else {
  138. dct_dc_size = getDCsizeChr();
  139. if (dct_dc_size != 0)
  140. dct_dc_diff = getDCdiff(dct_dc_size);
  141. else 
  142. dct_dc_diff = 0;
  143. if (dct_dc_size > 8)
  144. getbits1(); 
  145. }
  146. ld->block[0] = (short) dct_dc_diff;
  147. dc_recon(block_num, &ld->block[0]);
  148. if (coded) 
  149. {
  150. unsigned int * zigzag; 
  151. if (mp4_state->hdr.ac_pred_flag == 1) {
  152. if (mp4_state->coeff_pred.predict_dir == TOP)
  153. zigzag = mp4_tables->alternate_horizontal_scan;
  154. else
  155. zigzag = mp4_tables->alternate_vertical_scan;
  156. }
  157. else {
  158. zigzag = mp4_tables->zig_zag_scan;
  159. }
  160. i = 1;
  161. do 
  162. {
  163. event = vld_intra_dct();
  164. i+= event.run;
  165. ld->block[zigzag[i]] = (short) event.level;
  166. i++;
  167. } while (! event.last);
  168. }
  169. mp4_state->hdr.intrablock_rescaled = ac_rescaling(block_num, &ld->block[0]);
  170. if (! mp4_state->hdr.intrablock_rescaled)
  171. {
  172. ac_recon(block_num, &ld->block[0]);
  173. }
  174. ac_store(block_num, &ld->block[0]);
  175. if (mp4_state->hdr.quant_type == 0)
  176. {
  177. iquant(ld->block, 1);
  178. }
  179. else 
  180. {
  181. iquant_typefirst(ld->block);
  182. }
  183. idct(ld->block);
  184. return 1;
  185. }
  186. /***/
  187. int blockInter(int block_num, int coded)
  188. {
  189. event_t event;
  190. unsigned int * zigzag = mp4_tables->zig_zag_scan; // zigzag scan dir
  191. int i;
  192. clearblock(ld->block); 
  193. if (mp4_state->hdr.quant_type == 0) 
  194. {
  195. int q_scale = mp4_state->hdr.quantizer;
  196. int q_2scale = q_scale << 1;
  197. int q_add = (q_scale & 1) ? q_scale : (q_scale - 1);
  198. i = 0;
  199. do 
  200. {
  201. event = vld_inter_dct();
  202. i+= event.run;
  203. if (event.level > 0) {
  204. ld->block[zigzag[i]] = (q_2scale * event.level) + q_add;
  205. }
  206. else {
  207. ld->block[zigzag[i]] = (q_2scale * event.level) - q_add;
  208. }
  209. i++;
  210. } while (! event.last);
  211. }
  212. else 
  213. {
  214. int k, m = 0;
  215. i = 0;
  216. do 
  217. {
  218. event = vld_inter_dct();
  219. i+= event.run;
  220. k = (event.level > 0) ? 1 : -1;
  221. assert(ld->block[zigzag[i]] < 2047);
  222. assert(ld->block[zigzag[i]] > -2048);
  223. ld->block[zigzag[i]] = ((2 * event.level + k) * mp4_state->hdr.quantizer * 
  224. mp4_tables->nonintra_quant_matrix[zigzag[i]]) >> 4;
  225. assert(ld->block[zigzag[i]] < 2047);
  226. assert(ld->block[zigzag[i]] > -2048);
  227. m ^= ld->block[zigzag[i]];
  228. i++;
  229. } while (! event.last);
  230. if (!(m%2)) ld->block[63] ^= 1;
  231. }
  232. idct(ld->block);
  233. return 1;
  234. }
  235. static int getDCsizeLum()
  236. {
  237. int code;
  238. if (showbits(11) == 1) {
  239. flushbits(11);
  240. return 12;
  241. }
  242.   if (showbits(10) == 1) {
  243.     flushbits(10);
  244.     return 11;
  245.   }
  246.   if (showbits(9) == 1) {
  247.     flushbits(9);
  248.     return 10;
  249. }
  250. if (showbits(8) == 1) {
  251. flushbits(8);
  252. return 9;
  253. }
  254. if (showbits(7) == 1) {
  255. flushbits(7);
  256. return 8;
  257. }
  258. if (showbits(6) == 1) {
  259. flushbits(6);
  260. return 7;
  261. }  
  262. if (showbits(5) == 1) {
  263. flushbits(5);
  264. return 6;
  265. }
  266. if (showbits(4) == 1) {
  267. flushbits(4);
  268. return 5;
  269. }
  270. code = showbits(3);
  271. if (code == 1) {
  272. flushbits(3);
  273. return 4;
  274. } else if (code == 2) {
  275. flushbits(3);
  276. return 3;
  277. } else if (code == 3) {
  278. flushbits(3);
  279. return 0;
  280. }
  281.   code = showbits(2);
  282.   if (code == 2) {
  283. flushbits(2);
  284. return 2;
  285. } else if (code == 3) {
  286. flushbits(2);
  287. return 1;
  288. }     
  289. return 0;
  290. }
  291. static int getDCsizeChr()
  292. {
  293. if (showbits(12) == 1) {
  294. flushbits(12);
  295. return 12;
  296. }
  297. if (showbits(11) == 1) {
  298. flushbits(11);
  299. return 11;
  300. }
  301. if (showbits(10) == 1) {
  302. flushbits(10);
  303. return 10;
  304. }
  305. if (showbits(9) == 1) {
  306. flushbits(9);
  307. return 9;
  308. }
  309. if (showbits(8) == 1) {
  310. flushbits(8);
  311. return 8;
  312. }
  313. if (showbits(7) == 1) {
  314. flushbits(7);
  315. return 7;
  316. }
  317. if (showbits(6) == 1) {
  318. flushbits(6);
  319. return 6;
  320. }
  321. if (showbits(5) == 1) {
  322. flushbits(5);
  323. return 5;
  324. }
  325. if (showbits(4) == 1) {
  326. flushbits(4);
  327. return 4;
  328. if (showbits(3) == 1) {
  329. flushbits(3);
  330. return 3;
  331. return (3 - getbits(2));
  332. }
  333. static int getDCdiff(int dct_dc_size)
  334. {
  335. int code = getbits(dct_dc_size);
  336. int msb = code >> (dct_dc_size - 1);
  337. if (msb == 0) {
  338. return (-1 * (code^((int) pow(2.0,(double) dct_dc_size) - 1)));
  339. }
  340.   else { 
  341. return code;
  342. }
  343. }
  344. static void setDCscaler(int block_num) 
  345. {
  346. int type = (block_num < 4) ? 0 : 1;
  347. int quant = mp4_state->hdr.quantizer;
  348. if (type == 0) {
  349. if (quant > 0 && quant < 5) 
  350. mp4_state->hdr.dc_scaler = 8;
  351. else if (quant > 4 && quant < 9) 
  352. mp4_state->hdr.dc_scaler = (2 * quant);
  353. else if (quant > 8 && quant < 25) 
  354. mp4_state->hdr.dc_scaler = (quant + 8);
  355. else 
  356. mp4_state->hdr.dc_scaler = (2 * quant - 16);
  357. }
  358.   else {
  359. if (quant > 0 && quant < 5) 
  360. mp4_state->hdr.dc_scaler = 8;
  361. else if (quant > 4 && quant < 25) 
  362. mp4_state->hdr.dc_scaler = ((quant + 13) / 2);
  363. else 
  364. mp4_state->hdr.dc_scaler = (quant - 6);
  365. }
  366. }
  367. /***/