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

VC书籍

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #if ( (defined (WIN32)) && (! defined (_DECORE)) )
  4. #include <string.h>
  5. #include <io.h>
  6. #include <fcntl.h>
  7. #endif
  8. #include "gen_usetime.h"
  9. #include "debug.h"
  10. #include "mp4_vars.h"
  11. #include "getbits.h"
  12. #include "yuv2rgb.h"
  13. #include "decore.h"
  14. /**
  15.  *
  16. **/
  17. /***/
  18. static int flag_firstpicture = 1;
  19. /***/
  20. //解码器初始化
  21. int STDCALL decore(unsigned long handle, unsigned long dec_opt,
  22. void *param1, void *param2)
  23. {
  24. if (handle) 
  25. {
  26. switch (dec_opt)
  27. {
  28. case DEC_OPT_MEMORY_REQS:
  29. {
  30. DEC_PARAM *dec_param = (DEC_PARAM *)param1;
  31. DEC_MEM_REQS *dec_mem_reqs = (DEC_MEM_REQS *)param2;
  32. int coded_y_size = ((dec_param->x_dim + 64) * (dec_param->y_dim + 64));
  33. int coded_c_size = (((dec_param->x_dim>>1) + 64) * ((dec_param->y_dim>>1) + 64));
  34. int display_y_size = (dec_param->x_dim * dec_param->y_dim);
  35. int display_c_size = ((dec_param->x_dim * dec_param->y_dim) >> 2);
  36. int edged_size = coded_y_size + (2 * coded_c_size);
  37. int display_size = display_y_size + (2 * display_c_size);
  38. dec_mem_reqs->mp4_edged_ref_buffers_size = edged_size;
  39. dec_mem_reqs->mp4_edged_for_buffers_size = edged_size;
  40. dec_mem_reqs->mp4_display_buffers_size = display_size;
  41. dec_mem_reqs->mp4_state_size = sizeof(MP4_STATE);
  42. dec_mem_reqs->mp4_tables_size = sizeof(MP4_TABLES);
  43. dec_mem_reqs->mp4_stream_size = sizeof(MP4_STREAM);
  44. return DEC_OK;
  45. }
  46. case DEC_OPT_INIT:
  47. {
  48. DEC_PARAM *dec_param = (DEC_PARAM *) param1;
  49. // 初始化解码器的资源
  50. decore_init(dec_param->x_dim, dec_param->y_dim, dec_param->output_format,
  51. dec_param->time_incr, dec_param->buffers); 
  52. return DEC_OK;
  53. }
  54. break; 
  55. case DEC_OPT_RELEASE:
  56. {
  57. decore_release();
  58. return DEC_OK;
  59. }
  60. break;
  61. case DEC_OPT_SETPP:
  62. {
  63. DEC_SET *dec_set = (DEC_SET *) param1;
  64. int postproc_level = dec_set->postproc_level;
  65. if ((postproc_level < 0) | (postproc_level > 100))
  66. return DEC_BAD_FORMAT;
  67. if (postproc_level < 1) {
  68. mp4_state->post_flag = 0;
  69. return DEC_OK;
  70. }
  71. else 
  72. {
  73. mp4_state->post_flag = 1;
  74. if (postproc_level < 10) {
  75. mp4_state->pp_options = PP_DEBLOCK_Y_H;
  76. }
  77. else if (postproc_level < 20) {
  78. mp4_state->pp_options = PP_DEBLOCK_Y_H | PP_DEBLOCK_Y_V;
  79. }
  80. else if (postproc_level < 30) {
  81. mp4_state->pp_options = PP_DEBLOCK_Y_H | PP_DEBLOCK_Y_V | PP_DERING_Y;
  82. }
  83. else if (postproc_level < 40) {
  84. mp4_state->pp_options = PP_DEBLOCK_Y_H | PP_DEBLOCK_Y_V | PP_DERING_Y | PP_DEBLOCK_C_H;
  85. }
  86. else if (postproc_level < 50) {
  87. mp4_state->pp_options = PP_DEBLOCK_Y_H | PP_DEBLOCK_Y_V | PP_DERING_Y | 
  88. PP_DEBLOCK_C_H | PP_DEBLOCK_C_V;
  89. }
  90. else {
  91. mp4_state->pp_options = PP_DEBLOCK_Y_H | PP_DEBLOCK_Y_V | PP_DERING_Y | 
  92. PP_DEBLOCK_C_H | PP_DEBLOCK_C_V | PP_DERING_C;
  93. }
  94. }
  95. return DEC_OK;
  96. }
  97. break;
  98. case DEC_OPT_SETOUT:
  99. {
  100. DEC_PARAM *dec_param = (DEC_PARAM *) param1;
  101. decore_setoutput(dec_param->output_format);
  102. return DEC_OK;
  103. }
  104. break;
  105. default:
  106. {
  107. DEC_FRAME *dec_frame = (DEC_FRAME *) param1;
  108. if (decore_frame(dec_frame->bitstream, dec_frame->length, 
  109. dec_frame->bmp, dec_frame->stride, dec_frame->render_flag))
  110. return DEC_OK;
  111. else 
  112. return DEC_EXIT;
  113. }
  114. break;
  115. }
  116. }
  117. return DEC_BAD_FORMAT;
  118. }
  119. /***/
  120. int decore_alloc(DEC_BUFFERS buffers);
  121. // 初始化解码器的资源
  122. static int decore_init(int hor_size, int ver_size, int output_format,
  123.  int time_inc, DEC_BUFFERS buffers)
  124. {
  125. mp4_state = (MP4_STATE *) buffers.mp4_state;
  126. mp4_tables = (MP4_TABLES *) buffers.mp4_tables;
  127. ld = (MP4_STREAM *) buffers.mp4_stream;
  128. #ifndef _DECORE
  129. // 打开输入文件
  130. if ((ld->infile = open (mp4_state->infilename, O_RDONLY | O_BINARY)) < 0) {
  131. _Print ("Input file %s not foundn", mp4_state->infilename);
  132. exit(91);
  133. }
  134. initbits (NULL, 0);
  135. mp4_state->juice_flag = 0;
  136. #else 
  137. mp4_state->juice_flag = 1;
  138. #endif // _DECORE
  139. mp4_state->post_flag = 0;
  140. // 读第一次的vol和vop
  141. mp4_state->hdr.width = hor_size;
  142. mp4_state->hdr.height = ver_size;
  143. mp4_state->hdr.quant_precision = 5;
  144. mp4_state->hdr.bits_per_pixel = 8;
  145. mp4_state->hdr.quant_type = 0;
  146. if (flag_firstpicture == 1) {
  147. mp4_state->hdr.time_increment_resolution = 15;
  148. flag_firstpicture = 0;
  149. }
  150. mp4_state->hdr.complexity_estimation_disable = 1;
  151. decore_alloc (buffers);
  152. decore_setoutput (output_format);
  153. return 1;
  154. }
  155. /***/
  156. //解码器分配存储空间
  157. int decore_alloc(DEC_BUFFERS buffers)
  158. {
  159. mp4_state->hdr.picnum = 0;
  160. mp4_state->hdr.mb_xsize = mp4_state->hdr.width / 16;
  161. mp4_state->hdr.mb_ysize = mp4_state->hdr.height / 16;
  162. mp4_state->hdr.mba_size = mp4_state->hdr.mb_xsize * mp4_state->hdr.mb_ysize;
  163. // 设置图形维全局参数
  164. {
  165. mp4_state->horizontal_size = mp4_state->hdr.width;
  166. mp4_state->vertical_size = mp4_state->hdr.height;
  167. mp4_state->mb_width = mp4_state->horizontal_size / 16;
  168. mp4_state->mb_height = mp4_state->vertical_size / 16;
  169. mp4_state->coded_picture_width = mp4_state->horizontal_size + 64;
  170. mp4_state->coded_picture_height = mp4_state->vertical_size + 64;
  171. mp4_state->chrom_width = mp4_state->coded_picture_width >> 1;
  172. mp4_state->chrom_height = mp4_state->coded_picture_height >> 1;
  173. }
  174. // 初始化解码器
  175. initdecoder (buffers);
  176. return 1;
  177. }
  178. /***/
  179. // 解码帧
  180. int decore_frame(unsigned char *stream, int length, unsigned char *bmp, 
  181. unsigned int stride, int render_flag)
  182. {
  183. #ifndef _DECORE
  184. mp4_state->juice_flag = 0;
  185. _SetPrintCond(0, 1000, 0, 1000);
  186. _Print("- Picture %dr", mp4_state->hdr.picnum);
  187. #else
  188. initbits (stream, length);
  189. #endif // _DECORE
  190. getvolhdr();
  191. getgophdr();
  192. if (! getvophdr()) // 读取视频对象平面的头
  193. return 0;
  194. get_mp4picture(bmp, stride, render_flag); // 解码vop
  195. mp4_state->hdr.picnum++;
  196. return 1;
  197. }
  198. /***/
  199. // 解码器释放
  200. static int decore_release()
  201. {
  202. #ifndef _DECORE
  203. close (ld->infile);
  204. #endif // _DECORE
  205. return 1;
  206. }
  207. /***/
  208. // 解码器输出设置
  209. int decore_setoutput(int output_format)
  210. {
  211. mp4_state->flag_invert = +1;
  212. switch (output_format)
  213. {
  214. case DEC_RGB32:
  215. mp4_state->convert_yuv = yuv2rgb_32;
  216. mp4_state->flag_invert = -1;
  217. break;
  218. case DEC_RGB32_INV:
  219. mp4_state->convert_yuv = yuv2rgb_32;
  220. mp4_state->flag_invert = +1;
  221. break;
  222. case DEC_RGB24:
  223. mp4_state->convert_yuv = yuv2rgb_24;
  224. mp4_state->flag_invert = -1;
  225. break;
  226. case DEC_RGB24_INV:
  227. mp4_state->convert_yuv = yuv2rgb_24;
  228. mp4_state->flag_invert = +1;
  229. break;
  230. case DEC_RGB555:
  231. mp4_state->convert_yuv = yuv2rgb_555;
  232. mp4_state->flag_invert = -1;
  233. break;
  234. case DEC_RGB555_INV:
  235. mp4_state->convert_yuv = yuv2rgb_555;
  236. mp4_state->flag_invert = +1;
  237. break;
  238. case DEC_RGB565:
  239. mp4_state->convert_yuv = yuv2rgb_565;
  240. mp4_state->flag_invert = -1;
  241. break;
  242. case DEC_RGB565_INV:
  243. mp4_state->convert_yuv = yuv2rgb_565;
  244. mp4_state->flag_invert = +1;
  245. break;
  246. case DEC_420:
  247. mp4_state->convert_yuv = yuv12_out;
  248. break;
  249. case DEC_YUV2:
  250. mp4_state->convert_yuv = yuy2_out;
  251. break;
  252. case DEC_UYVY:
  253. mp4_state->convert_yuv = uyvy_out;
  254. break;
  255. }
  256. return 1;
  257. }
  258. /**
  259.  * for a console application
  260. **/
  261. #ifndef _DECORE
  262. /***/
  263. static int dec_reinit();
  264. static void options (int *argcp, char **argvp[]);
  265. static void optionhelp (int *argcp);
  266. int main (int argc, char *argv[])
  267. {
  268.   char * infilename = argv[1];
  269. char outputfilename[256] = "Test.yuv";
  270. DEC_MEM_REQS decMemReqs;
  271. DEC_PARAM decParam;
  272. decParam.x_dim = 352;
  273. decParam.y_dim = 288;
  274. decParam.output_format = 0;
  275. decParam.time_incr = 0;
  276. decore(1, DEC_OPT_MEMORY_REQS, &decParam, &decMemReqs);
  277. decParam.buffers.mp4_edged_ref_buffers = malloc(decMemReqs.mp4_edged_ref_buffers_size);
  278. decParam.buffers.mp4_edged_for_buffers = malloc(decMemReqs.mp4_edged_for_buffers_size);
  279. decParam.buffers.mp4_display_buffers = malloc(decMemReqs.mp4_display_buffers_size);
  280. decParam.buffers.mp4_state = malloc(decMemReqs.mp4_state_size);
  281. decParam.buffers.mp4_tables = malloc(decMemReqs.mp4_tables_size);
  282. decParam.buffers.mp4_stream = malloc(decMemReqs.mp4_stream_size);
  283. memset(decParam.buffers.mp4_state, 0, decMemReqs.mp4_state_size);
  284. memset(decParam.buffers.mp4_tables, 0, decMemReqs.mp4_tables_size);
  285. memset(decParam.buffers.mp4_stream, 0, decMemReqs.mp4_stream_size);
  286. ((MP4_STATE *) decParam.buffers.mp4_state)->infilename = infilename;
  287. ((MP4_STATE *) decParam.buffers.mp4_state)->outputname = outputfilename;
  288. decore(1, DEC_OPT_INIT, &decParam, NULL);
  289. startTimer();
  290. // 解码帧
  291. {
  292. DEC_FRAME decFrame;
  293. decFrame.bitstream = NULL;
  294. decFrame.bmp = NULL;
  295. decFrame.length = 0;
  296. decFrame.render_flag = 0;
  297. while ( decore(1, 0, &decFrame, NULL) == DEC_OK )
  298. ;
  299. }
  300. stopTimer();
  301. displayTimer(mp4_state->hdr.picnum);
  302. return 1;
  303. }
  304. /***/
  305. static void options (int *argcp, char **argvp[])
  306. {
  307. (*argvp)++;
  308. (*argcp)--;
  309.   while (*argcp > 1 && (*argvp)[1][0] == '-')
  310.   {
  311.     switch (toupper ((*argvp)[1][1]))
  312.     {
  313.       case 'O':
  314. mp4_state->output_flag = 1;
  315.         mp4_state->outputname = (*argvp)[2];
  316. (*argvp) += 2;
  317. (*argcp) -= 2;
  318. break;
  319. case 'J':
  320. mp4_state->juice_flag = 1;
  321. mp4_state->juice_hor = atoi ((*argvp)[2]);
  322. mp4_state->juice_ver = atoi ((*argvp)[3]);
  323.     (*argvp) += 3;
  324. (*argcp) -= 3;
  325. break;
  326.       default:
  327.         printf ("Error: Undefined option -%c ignoredn", (*argvp)[1][1]);
  328.     }
  329.   }
  330. }
  331. /***/
  332. static void optionhelp(int *argcp)
  333. {
  334.   if (*argcp < 2)
  335.   {
  336.     _Print ("Usage: opendivx_dec bitstream {options} n");
  337. _Print ("Options: -o {outputfilename} YUV concatenated file outputn");
  338. _Print ("         -j {hor_size ver_size} juice stream and its picture formatn");
  339.     exit (0);
  340.   }
  341. }
  342. int dec_reinit()
  343. {
  344.   if (ld->infile != 0)
  345.     lseek (ld->infile, 0l, 0);
  346.   initbits (NULL, 0);
  347. return 1;
  348. }
  349. /***/
  350. #endif // !_DECORE