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

VC书籍

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <fcntl.h>
  5. #include <string.h>
  6. #include <assert.h>
  7. #ifdef WIN32
  8. #include <io.h>
  9. #endif
  10. #include "mp4_vars.h"
  11. #include "decore.h"
  12. // 解码器初始化
  13. void initdecoder (DEC_BUFFERS buffers)
  14. {
  15.   int i, j, cc;
  16. save_tables(mp4_tables);
  17.   mp4_state->clp = mp4_state->clp_data + 384;
  18.   for (i = -384; i < 640; i++)
  19.     mp4_state->clp[i] = (unsigned char) ( (i < 0) ? 0 : ((i > 255) ? 255 : i) );
  20. //     DC和AC系数的预测因为DCT变换后的系数分为DC(直流)和AC(交流)两类而DC系数是左上角
  21. // 的第一个值,其它的为AC系数 DC/AC预测是使用相邻块的DC/AC值来预测当前块的系数值。
  22. //  (注意:预测仅在第一行和第一列进行)
  23.     // 直流(dc)预测
  24. for (i = 0; i < (2*DEC_MBC+1); i++)
  25. mp4_state->coeff_pred.dc_store_lum[0][i] = 1024;
  26. for (i = 1; i < (2*DEC_MBR+1); i++)
  27. mp4_state->coeff_pred.dc_store_lum[i][0] = 1024;
  28. for (i = 0; i < (DEC_MBC+1); i++) {
  29. mp4_state->coeff_pred.dc_store_chr[0][0][i] = 1024;
  30. mp4_state->coeff_pred.dc_store_chr[1][0][i] = 1024;
  31. }
  32. for (i = 1; i < (DEC_MBR+1); i++) {
  33. mp4_state->coeff_pred.dc_store_chr[0][i][0] = 1024;
  34. mp4_state->coeff_pred.dc_store_chr[1][i][0] = 1024;
  35. }
  36.     // 交流(ac)预测
  37. for (i = 0; i < (2*DEC_MBC+1); i++)
  38. for (j = 0; j < 7; j++) {
  39. mp4_state->coeff_pred.ac_left_lum[0][i][j] = 0;
  40. mp4_state->coeff_pred.ac_top_lum[0][i][j] = 0;
  41. }
  42. for (i = 1; i < (2*DEC_MBR+1); i++)
  43. for (j = 0; j < 7; j++) {
  44. mp4_state->coeff_pred.ac_left_lum[i][0][j] = 0;
  45. mp4_state->coeff_pred.ac_top_lum[i][0][j] = 0;
  46. }
  47. for (i = 0; i < (DEC_MBC+1); i++)
  48. for (j = 0; j < 7; j++) {
  49. mp4_state->coeff_pred.ac_left_chr[0][0][i][j] = 0; 
  50. mp4_state->coeff_pred.ac_top_chr[0][0][i][j] = 0;
  51. mp4_state->coeff_pred.ac_left_chr[1][0][i][j] = 0;
  52. mp4_state->coeff_pred.ac_top_chr[1][0][i][j] = 0;
  53. }
  54. for (i = 1; i < (DEC_MBR+1); i++)
  55. for (j = 0; j < 7; j++) {
  56. mp4_state->coeff_pred.ac_left_chr[0][i][0][j] = 0;
  57. mp4_state->coeff_pred.ac_top_chr[0][i][0][j] = 0;
  58. mp4_state->coeff_pred.ac_left_chr[1][i][0][j] = 0;
  59. mp4_state->coeff_pred.ac_top_chr[1][i][0][j] = 0;
  60. }
  61. for (i = 0; i < mp4_state->mb_width + 1; i++)
  62. mp4_state->modemap[0][i] = INTRA;
  63. for (i = 0; i < mp4_state->mb_height + 1; i++) {
  64. mp4_state->modemap[i][0] = INTRA;
  65. mp4_state->modemap[i][mp4_state->mb_width+1] = INTRA;
  66. }
  67.   for (cc = 0; cc < 3; cc++)
  68.   {
  69.     if (cc == 0)
  70.     {
  71. edged_ref[cc] = (unsigned char *) buffers.mp4_edged_ref_buffers;
  72. assert(edged_ref[cc]);
  73. edged_for[cc] = (unsigned char *) buffers.mp4_edged_for_buffers;
  74. assert(edged_for[cc]);
  75.       frame_ref[cc] = edged_ref[cc] + mp4_state->coded_picture_width * 32 + 32;
  76.       frame_for[cc] = edged_for[cc] + mp4_state->coded_picture_width * 32 + 32;
  77.     } 
  78.     else
  79.     {
  80. unsigned int offset;
  81. if (cc == 1) 
  82. offset = mp4_state->coded_picture_width * mp4_state->coded_picture_height;
  83. else 
  84. offset = mp4_state->coded_picture_width * mp4_state->coded_picture_height +
  85.    mp4_state->chrom_width * mp4_state->chrom_height;
  86. edged_ref[cc] = (unsigned char *) buffers.mp4_edged_ref_buffers + offset;
  87. assert(edged_ref[cc]);
  88. edged_for[cc] = (unsigned char *) buffers.mp4_edged_for_buffers + offset;
  89. assert(edged_for[cc]);
  90.       frame_ref[cc] = edged_ref[cc] + mp4_state->chrom_width * 16 + 16;
  91.       frame_for[cc] = edged_for[cc] + mp4_state->chrom_width * 16 + 16;
  92.     }
  93.   }
  94. // 显示帧
  95. for (cc = 0; cc < 3; cc++) 
  96. {
  97. unsigned int offset;
  98. switch (cc) 
  99. {
  100. case 0:
  101. offset = 0;
  102. break;
  103. case 1:
  104. offset = mp4_state->horizontal_size * mp4_state->vertical_size;
  105. break;
  106. case 2:
  107. offset = (mp4_state->horizontal_size * mp4_state->vertical_size) + 
  108. ((mp4_state->horizontal_size * mp4_state->vertical_size) >> 2);
  109. break;
  110. }
  111. display_frame[cc] = (unsigned char *) buffers.mp4_display_buffers + offset;
  112. assert(display_frame[cc]);
  113. }
  114. }
  115. /***/
  116. void closedecoder ()
  117. {
  118. }