headers.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:16k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "../mpeg3private.h"
  2. #include "../mpeg3protos.h"
  3. #include "mpeg3video.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. int mpeg3video_getseqhdr(mpeg3video_t *video)
  7. {
  8. int i;
  9. int aspect_ratio, picture_rate, vbv_buffer_size;
  10. int constrained_parameters_flag;
  11. int load_intra_quantizer_matrix, load_non_intra_quantizer_matrix;
  12. video->horizontal_size = mpeg3bits_getbits(video->vstream, 12);
  13. video->vertical_size = mpeg3bits_getbits(video->vstream, 12);
  14. aspect_ratio = mpeg3bits_getbits(video->vstream, 4);
  15. video->framerate_code = mpeg3bits_getbits(video->vstream, 4);
  16. video->bitrate = mpeg3bits_getbits(video->vstream, 18);
  17. mpeg3bits_getbit_noptr(video->vstream); /* marker bit (=1) */
  18. vbv_buffer_size = mpeg3bits_getbits(video->vstream, 10);
  19. constrained_parameters_flag = mpeg3bits_getbit_noptr(video->vstream);
  20. video->frame_rate = mpeg3_frame_rate_table[video->framerate_code];
  21.   load_intra_quantizer_matrix = mpeg3bits_getbit_noptr(video->vstream);
  22.   if(load_intra_quantizer_matrix)
  23. {
  24.      for(i = 0; i < 64; i++)
  25.        video->intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
  26.    }
  27.    else 
  28. {
  29.      for(i = 0; i < 64; i++)
  30.        video->intra_quantizer_matrix[i] = mpeg3_default_intra_quantizer_matrix[i];
  31.    }
  32. load_non_intra_quantizer_matrix = mpeg3bits_getbit_noptr(video->vstream);
  33. if(load_non_intra_quantizer_matrix)
  34. {
  35.      for(i = 0; i < 64; i++)
  36.        video->non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
  37.    }
  38.    else 
  39. {
  40.      for(i = 0; i < 64; i++)
  41.        video->non_intra_quantizer_matrix[i] = 16;
  42.    }
  43. /* copy luminance to chrominance matrices */
  44.    for(i = 0; i < 64; i++)
  45. {
  46.      video->chroma_intra_quantizer_matrix[i] = video->intra_quantizer_matrix[i];
  47.       video->chroma_non_intra_quantizer_matrix[i] = video->non_intra_quantizer_matrix[i];
  48.    }
  49. return 0;
  50. }
  51. /* decode sequence extension */
  52. int mpeg3video_sequence_extension(mpeg3video_t *video)
  53. {
  54. int prof_lev;
  55. int horizontal_size_extension, vertical_size_extension;
  56. int bit_rate_extension, vbv_buffer_size_extension, low_delay;
  57. int frame_rate_extension_n, frame_rate_extension_d;
  58. int pos = 0;
  59. video->mpeg2 = 1;
  60. video->scalable_mode = SC_NONE; /* unless overwritten by seq. scal. ext. */
  61. prof_lev = mpeg3bits_getbyte_noptr(video->vstream);
  62. video->prog_seq = mpeg3bits_getbit_noptr(video->vstream);
  63. video->chroma_format = mpeg3bits_getbits(video->vstream, 2);
  64. horizontal_size_extension = mpeg3bits_getbits(video->vstream, 2);
  65. vertical_size_extension = mpeg3bits_getbits(video->vstream, 2);
  66. bit_rate_extension = mpeg3bits_getbits(video->vstream, 12);
  67. mpeg3bits_getbit_noptr(video->vstream);
  68. vbv_buffer_size_extension = mpeg3bits_getbyte_noptr(video->vstream);
  69. low_delay = mpeg3bits_getbit_noptr(video->vstream);
  70. frame_rate_extension_n = mpeg3bits_getbits(video->vstream, 2);
  71. frame_rate_extension_d = mpeg3bits_getbits(video->vstream, 5);
  72. video->horizontal_size = (horizontal_size_extension << 12) | (video->horizontal_size & 0x0fff);
  73. video->vertical_size = (vertical_size_extension << 12) | (video->vertical_size & 0x0fff);
  74. return 0;
  75. }
  76. /* decode sequence display extension */
  77. int mpeg3video_sequence_display_extension(mpeg3video_t *video)
  78. {
  79. int colour_primaries = 0, transfer_characteristics = 0;
  80. int display_horizontal_size, display_vertical_size;
  81. int pos = 0;
  82. int video_format = mpeg3bits_getbits(video->vstream, 3);
  83. int colour_description = mpeg3bits_getbit_noptr(video->vstream);
  84. if(colour_description)
  85. {
  86.      colour_primaries = mpeg3bits_getbyte_noptr(video->vstream);
  87.      transfer_characteristics = mpeg3bits_getbyte_noptr(video->vstream);
  88.      video->matrix_coefficients = mpeg3bits_getbyte_noptr(video->vstream);
  89. }
  90. display_horizontal_size = mpeg3bits_getbits(video->vstream, 14);
  91. mpeg3bits_getbit_noptr(video->vstream);
  92. display_vertical_size = mpeg3bits_getbits(video->vstream, 14);
  93. return 0;
  94. }
  95. /* decode quant matrix entension */
  96. int mpeg3video_quant_matrix_extension(mpeg3video_t *video)
  97. {
  98. int i;
  99. int load_intra_quantiser_matrix, load_non_intra_quantiser_matrix;
  100. int load_chroma_intra_quantiser_matrix;
  101. int load_chroma_non_intra_quantiser_matrix;
  102. int pos = 0;
  103. if((load_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
  104. {
  105.        for(i = 0; i < 64; i++)
  106. {
  107.      video->chroma_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
  108.      = video->intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
  109.      = mpeg3bits_getbyte_noptr(video->vstream);
  110.        }
  111. }
  112. if((load_non_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
  113. {
  114.      for (i = 0; i < 64; i++)
  115. {
  116.      video->chroma_non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
  117.      = video->non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
  118.      = mpeg3bits_getbyte_noptr(video->vstream);
  119.      }
  120. }
  121. if((load_chroma_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
  122. {
  123.      for(i = 0; i < 64; i++)
  124.      video->chroma_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
  125. }
  126. if((load_chroma_non_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
  127. {
  128.        for(i = 0; i < 64; i++)
  129.      video->chroma_non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
  130. }
  131. return 0;
  132. }
  133. /* decode sequence scalable extension */
  134. int mpeg3video_sequence_scalable_extension(mpeg3video_t *video)
  135. {
  136. int layer_id;
  137. video->scalable_mode = mpeg3bits_getbits(video->vstream, 2) + 1; /* add 1 to make SC_DP != SC_NONE */
  138. layer_id = mpeg3bits_getbits(video->vstream, 4);
  139. if(video->scalable_mode == SC_SPAT)
  140. {
  141.      video->llw = mpeg3bits_getbits(video->vstream, 14); /* lower_layer_prediction_horizontal_size */
  142.      mpeg3bits_getbit_noptr(video->vstream);
  143.      video->llh = mpeg3bits_getbits(video->vstream, 14); /* lower_layer_prediction_vertical_size */
  144.      video->hm = mpeg3bits_getbits(video->vstream, 5);
  145.      video->hn = mpeg3bits_getbits(video->vstream, 5);
  146.      video->vm = mpeg3bits_getbits(video->vstream, 5);
  147.      video->vn = mpeg3bits_getbits(video->vstream, 5);
  148. }
  149. if(video->scalable_mode == SC_TEMP)
  150.        fprintf(stderr, "mpeg3video_sequence_scalable_extension: temporal scalability not implementedn");
  151. return 0;
  152. }
  153. /* decode picture display extension */
  154. int mpeg3video_picture_display_extension(mpeg3video_t *video)
  155. {
  156. int n, i;
  157. short frame_centre_horizontal_offset[3];
  158. short frame_centre_vertical_offset[3];
  159. if(video->prog_seq || video->pict_struct != FRAME_PICTURE)
  160. n = 1;
  161. else 
  162. n = video->repeatfirst ? 3 : 2;
  163. for(i = 0; i < n; i++)
  164. {
  165.      frame_centre_horizontal_offset[i] = (short)mpeg3bits_getbits(video->vstream, 16);
  166.      mpeg3bits_getbit_noptr(video->vstream);
  167.      frame_centre_vertical_offset[i] = (short)mpeg3bits_getbits(video->vstream, 16);
  168.      mpeg3bits_getbit_noptr(video->vstream);
  169. }
  170. return 0;
  171. }
  172. /* decode picture coding extension */
  173. int mpeg3video_picture_coding_extension(mpeg3video_t *video)
  174. {
  175. int chroma_420_type, composite_display_flag;
  176. int v_axis = 0, field_sequence = 0, sub_carrier = 0, burst_amplitude = 0, sub_carrier_phase = 0;
  177. video->h_forw_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
  178. video->v_forw_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
  179. video->h_back_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
  180. video->v_back_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
  181. video->dc_prec = mpeg3bits_getbits(video->vstream, 2);
  182. video->pict_struct = mpeg3bits_getbits(video->vstream, 2);
  183. video->topfirst = mpeg3bits_getbit_noptr(video->vstream);
  184. video->frame_pred_dct = mpeg3bits_getbit_noptr(video->vstream);
  185. video->conceal_mv = mpeg3bits_getbit_noptr(video->vstream);
  186. video->qscale_type = mpeg3bits_getbit_noptr(video->vstream);
  187. video->intravlc = mpeg3bits_getbit_noptr(video->vstream);
  188. video->altscan = mpeg3bits_getbit_noptr(video->vstream);
  189. video->repeatfirst = mpeg3bits_getbit_noptr(video->vstream);
  190. chroma_420_type = mpeg3bits_getbit_noptr(video->vstream);
  191. video->prog_frame = mpeg3bits_getbit_noptr(video->vstream);
  192. if(video->repeat_count > 100)
  193. video->repeat_count = 0;
  194. video->repeat_count += 100;
  195. video->current_repeat = 0;
  196. if(video->prog_seq)
  197. {
  198. if(video->repeatfirst)
  199. {
  200. if(video->topfirst)
  201. video->repeat_count += 200;
  202. else
  203. video->repeat_count += 100;
  204. }
  205. }
  206. else
  207. if(video->prog_frame)
  208. {
  209. if(video->repeatfirst)
  210. {
  211. video->repeat_count += 50;
  212. }
  213. }
  214. /*printf("mpeg3video_picture_coding_extension %dn", video->repeat_count); */
  215. composite_display_flag = mpeg3bits_getbit_noptr(video->vstream);
  216. if(composite_display_flag)
  217. {
  218.      v_axis = mpeg3bits_getbit_noptr(video->vstream);
  219.      field_sequence = mpeg3bits_getbits(video->vstream, 3);
  220.      sub_carrier = mpeg3bits_getbit_noptr(video->vstream);
  221.      burst_amplitude = mpeg3bits_getbits(video->vstream, 7);
  222.      sub_carrier_phase = mpeg3bits_getbyte_noptr(video->vstream);
  223. }
  224. return 0;
  225. }
  226. /* decode picture spatial scalable extension */
  227. int mpeg3video_picture_spatial_scalable_extension(mpeg3video_t *video)
  228. {
  229. video->pict_scal = 1; /* use spatial scalability in this picture */
  230. video->lltempref = mpeg3bits_getbits(video->vstream, 10);
  231. mpeg3bits_getbit_noptr(video->vstream);
  232. video->llx0 = mpeg3bits_getbits(video->vstream, 15);
  233. if(video->llx0 >= 16384) video->llx0 -= 32768;
  234. mpeg3bits_getbit_noptr(video->vstream);
  235. video->lly0 = mpeg3bits_getbits(video->vstream, 15);
  236. if(video->lly0 >= 16384) video->lly0 -= 32768;
  237. video->stwc_table_index = mpeg3bits_getbits(video->vstream, 2);
  238. video->llprog_frame = mpeg3bits_getbit_noptr(video->vstream);
  239. video->llfieldsel = mpeg3bits_getbit_noptr(video->vstream);
  240. return 0;
  241. }
  242. /* decode picture temporal scalable extension
  243.  *
  244.  * not implemented
  245.  *
  246.  */
  247. int mpeg3video_picture_temporal_scalable_extension(mpeg3video_t *video)
  248. {
  249.    fprintf(stderr, "mpeg3video_picture_temporal_scalable_extension: temporal scalability not supportedn");
  250. return 0;
  251. }
  252. /* decode extension and user data */
  253. int mpeg3video_ext_user_data(mpeg3video_t *video)
  254. {
  255.    int code = mpeg3bits_next_startcode(video->vstream);
  256.    while((code == MPEG3_EXT_START_CODE || code == MPEG3_USER_START_CODE) &&
  257. !mpeg3bits_eof(video->vstream))
  258. {
  259.      mpeg3bits_refill(video->vstream);
  260.      if(code == MPEG3_EXT_START_CODE)
  261. {
  262.        int ext_id = mpeg3bits_getbits(video->vstream, 4);
  263.        switch(ext_id)
  264. {
  265.      case SEQ_ID:
  266. mpeg3video_sequence_extension(video);
  267. break;
  268.      case DISP_ID:
  269. mpeg3video_sequence_display_extension(video);
  270. break;
  271.      case QUANT_ID:
  272. mpeg3video_quant_matrix_extension(video);
  273. break;
  274.      case SEQSCAL_ID:
  275. mpeg3video_sequence_scalable_extension(video);
  276. break;
  277.      case PANSCAN_ID:
  278. mpeg3video_picture_display_extension(video);
  279. break;
  280.      case CODING_ID:
  281. mpeg3video_picture_coding_extension(video);
  282. break;
  283.      case SPATSCAL_ID:
  284. mpeg3video_picture_spatial_scalable_extension(video);
  285. break;
  286.      case TEMPSCAL_ID:
  287. mpeg3video_picture_temporal_scalable_extension(video);
  288. break;
  289.      default:
  290. fprintf(stderr,"mpeg3video_ext_user_data: reserved extension start code ID %dn", ext_id);
  291. break;
  292.        }
  293.     }
  294.     code = mpeg3bits_next_startcode(video->vstream);
  295.    }
  296. return 0;
  297. }
  298. /* decode group of pictures header */
  299. int mpeg3video_getgophdr(mpeg3video_t *video)
  300. {
  301. int drop_flag, closed_gop, broken_link;
  302. //printf("%xn", mpeg3bits_tell(video->vstream));
  303. video->has_gops = 1;
  304. drop_flag = mpeg3bits_getbit_noptr(video->vstream);
  305. video->gop_timecode.hour = mpeg3bits_getbits(video->vstream, 5);
  306. video->gop_timecode.minute = mpeg3bits_getbits(video->vstream, 6);
  307. mpeg3bits_getbit_noptr(video->vstream);
  308. video->gop_timecode.second = mpeg3bits_getbits(video->vstream, 6);
  309. video->gop_timecode.frame = mpeg3bits_getbits(video->vstream, 6);
  310. closed_gop = mpeg3bits_getbit_noptr(video->vstream);
  311. broken_link = mpeg3bits_getbit_noptr(video->vstream);
  312. /*
  313.  * printf("%d:%d:%d:%d %d %d %dn", video->gop_timecode.hour, video->gop_timecode.minute, video->gop_timecode.second, video->gop_timecode.frame, 
  314.  *   drop_flag, closed_gop, broken_link);
  315.  */
  316. return mpeg3bits_error(video->vstream);
  317. }
  318. /* decode picture header */
  319. int mpeg3video_getpicturehdr(mpeg3video_t *video)
  320. {
  321. int temp_ref, vbv_delay;
  322. video->pict_scal = 0; /* unless overwritten by pict. spat. scal. ext. */
  323. temp_ref = mpeg3bits_getbits(video->vstream, 10);
  324. video->pict_type = mpeg3bits_getbits(video->vstream, 3);
  325. vbv_delay = mpeg3bits_getbits(video->vstream, 16);
  326. if(video->pict_type == P_TYPE || video->pict_type == B_TYPE)
  327. {
  328.      video->full_forw = mpeg3bits_getbit_noptr(video->vstream);
  329.      video->forw_r_size = mpeg3bits_getbits(video->vstream, 3) - 1;
  330. }
  331. if(video->pict_type == B_TYPE)
  332. {
  333.      video->full_back = mpeg3bits_getbit_noptr(video->vstream);
  334.      video->back_r_size = mpeg3bits_getbits(video->vstream, 3) - 1;
  335. }
  336. /* get extra bit picture */
  337. while(mpeg3bits_getbit_noptr(video->vstream) &&
  338. !mpeg3bits_eof(video->vstream)) 
  339. mpeg3bits_getbyte_noptr(video->vstream);
  340. return 0;
  341. }
  342. int mpeg3video_get_header(mpeg3video_t *video, int dont_repeat)
  343. {
  344. unsigned int code;
  345. /* a sequence header should be found before returning from `getheader' the */
  346. /* first time (this is to set horizontal/vertical size properly) */
  347. /* Repeat the frame until it's less than 1 count from repeat_count */
  348. if(video->repeat_count - video->current_repeat >= 100 && !dont_repeat)
  349. {
  350. return 0;
  351. }
  352. if(dont_repeat)
  353. {
  354. video->repeat_count = 0;
  355. video->current_repeat = 0;
  356. }
  357. else
  358. video->repeat_count -= video->current_repeat;
  359. //printf("mpeg3video_get_header 1 %d %dn", 
  360. // video->vstream->demuxer->titles[0]->fs->current_byte, 
  361. // video->vstream->demuxer->titles[0]->fs->total_bytes);
  362. while(1)
  363. {
  364. //printf("mpeg3video_get_header 1 %llxn", mpeg3bits_tell(video->vstream));
  365. /* look for startcode */
  366.      code = mpeg3bits_next_startcode(video->vstream);
  367. //printf("mpeg3video_get_header 2 %x %x %08xn", 
  368. // video->vstream->demuxer->titles[0]->fs->current_byte, 
  369. // video->vstream->demuxer->titles[0]->fs->total_bytes,
  370. // code);
  371. //printf("mpeg3video_get_header 2 %dn", mpeg3bits_eof(video->vstream));
  372. if(mpeg3bits_eof(video->vstream)) return 1;
  373. if(code != MPEG3_SEQUENCE_END_CODE) mpeg3bits_refill(video->vstream);
  374.  
  375.      switch(code)
  376. {
  377.      case MPEG3_SEQUENCE_START_CODE:
  378.      video->found_seqhdr = 1;
  379.      mpeg3video_getseqhdr(video);  
  380.      mpeg3video_ext_user_data(video);
  381.      break;
  382.      case MPEG3_GOP_START_CODE:
  383.      mpeg3video_getgophdr(video);
  384.      mpeg3video_ext_user_data(video);
  385.      break;
  386.      case MPEG3_PICTURE_START_CODE:
  387. //printf("%xn", mpeg3bits_tell(video->vstream));
  388.      mpeg3video_getpicturehdr(video);
  389.      mpeg3video_ext_user_data(video);
  390.      if(video->found_seqhdr) return 0;       /* Exit here */
  391.      break;
  392.      case MPEG3_SEQUENCE_END_CODE:
  393. // Continue until the end
  394. mpeg3bits_refill(video->vstream);
  395. break;
  396.      default:
  397.      break;
  398.      }
  399.    }
  400.   return 1;      /* Shouldn't be reached. */
  401. }
  402. int mpeg3video_ext_bit_info(mpeg3_slice_buffer_t *slice_buffer)
  403. {
  404. while(mpeg3slice_getbit(slice_buffer)) mpeg3slice_getbyte(slice_buffer);
  405. return 0;
  406. }
  407. /* decode slice header */
  408. int mpeg3video_getslicehdr(mpeg3_slice_t *slice, mpeg3video_t *video)
  409. {
  410. int slice_vertical_position_extension, intra_slice;
  411. int qs;
  412.    slice_vertical_position_extension = (video->mpeg2 && video->vertical_size > 2800) ? 
  413. mpeg3slice_getbits(slice->slice_buffer, 3) : 0;
  414.    if(video->scalable_mode == SC_DP) slice->pri_brk = mpeg3slice_getbits(slice->slice_buffer, 7);
  415.    qs = mpeg3slice_getbits(slice->slice_buffer, 5);
  416.    slice->quant_scale = video->mpeg2 ? (video->qscale_type ? mpeg3_non_linear_mquant_table[qs] : (qs << 1)) : qs;
  417.    if(mpeg3slice_getbit(slice->slice_buffer))
  418. {
  419.      intra_slice = mpeg3slice_getbit(slice->slice_buffer);
  420.      mpeg3slice_getbits(slice->slice_buffer, 7);
  421.      mpeg3video_ext_bit_info(slice->slice_buffer);
  422.    }
  423.    else 
  424. intra_slice = 0;
  425. return slice_vertical_position_extension;
  426. }