puthdr.c
上传用户:ma_junhua
上传日期:2008-04-11
资源大小:2752k
文件大小:7k
开发平台:

C/C++

  1. /* puthdr.c, generation of headers                                          */
  2. /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
  3. /*
  4.  * Disclaimer of Warranty
  5.  *
  6.  * These software programs are available to the user without any license fee or
  7.  * royalty on an "as is" basis.  The MPEG Software Simulation Group disclaims
  8.  * any and all warranties, whether express, implied, or statuary, including any
  9.  * implied warranties or merchantability or of fitness for a particular
  10.  * purpose.  In no event shall the copyright-holder be liable for any
  11.  * incidental, punitive, or consequential damages of any kind whatsoever
  12.  * arising from the use of these programs.
  13.  *
  14.  * This disclaimer of warranty extends to the user of these programs and user's
  15.  * customers, employees, agents, transferees, successors, and assigns.
  16.  *
  17.  * The MPEG Software Simulation Group does not represent or warrant that the
  18.  * programs furnished hereunder are free of infringement of any third-party
  19.  * patents.
  20.  *
  21.  * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
  22.  * are subject to royalty fees to patent holders.  Many of these patents are
  23.  * general enough such that they are unavoidable regardless of implementation
  24.  * design.
  25.  *
  26.  */
  27. #include <stdio.h>
  28. #include <math.h>
  29. #include "config.h"
  30. #include "global.h"
  31. /* private prototypes */
  32. static int frametotc _ANSI_ARGS_((int frame));
  33. /* generate sequence header (6.2.2.1, 6.3.3)
  34.  *
  35.  * matrix download not implemented
  36.  */
  37. void putseqhdr()
  38. {
  39.   int i;
  40.   alignbits();
  41.   putbits(SEQ_START_CODE,32); /* sequence_header_code */
  42.   putbits(horizontal_size,12); /* horizontal_size_value */
  43.   putbits(vertical_size,12); /* vertical_size_value */
  44.   putbits(aspectratio,4); /* aspect_ratio_information */
  45.   putbits(frame_rate_code,4); /* frame_rate_code */
  46.   putbits((int)ceil(bit_rate/400.0),18); /* bit_rate_value */
  47.   putbits(1,1); /* marker_bit */
  48.   putbits(vbv_buffer_size,10); /* vbv_buffer_size_value */
  49.   putbits(constrparms,1); /* constrained_parameters_flag */
  50.   putbits(load_iquant,1); /* load_intra_quantizer_matrix */
  51.   if (load_iquant)
  52.     for (i=0; i<64; i++)  /* matrices are always downloaded in zig-zag order */
  53.       putbits(intra_q[zig_zag_scan[i]],8); /* intra_quantizer_matrix */
  54.   putbits(load_niquant,1); /* load_non_intra_quantizer_matrix */
  55.   if (load_niquant)
  56.     for (i=0; i<64; i++)
  57.       putbits(inter_q[zig_zag_scan[i]],8); /* non_intra_quantizer_matrix */
  58. }
  59. /* generate sequence extension (6.2.2.3, 6.3.5) header (MPEG-2 only) */
  60. void putseqext()
  61. {
  62.   alignbits();
  63.   putbits(EXT_START_CODE,32); /* extension_start_code */
  64.   putbits(SEQ_ID,4); /* extension_start_code_identifier */
  65.   putbits((profile<<4)|level,8); /* profile_and_level_indication */
  66.   putbits(prog_seq,1); /* progressive sequence */
  67.   putbits(chroma_format,2); /* chroma_format */
  68.   putbits(horizontal_size>>12,2); /* horizontal_size_extension */
  69.   putbits(vertical_size>>12,2); /* vertical_size_extension */
  70.   putbits(((int)ceil(bit_rate/400.0))>>18,12); /* bit_rate_extension */
  71.   putbits(1,1); /* marker_bit */
  72.   putbits(vbv_buffer_size>>10,8); /* vbv_buffer_size_extension */
  73.   putbits(0,1); /* low_delay  -- currently not implemented */
  74.   putbits(0,2); /* frame_rate_extension_n */
  75.   putbits(0,5); /* frame_rate_extension_d */
  76. }
  77. /* generate sequence display extension (6.2.2.4, 6.3.6)
  78.  *
  79.  * content not yet user setable
  80.  */
  81. void putseqdispext()
  82. {
  83.   alignbits();
  84.   putbits(EXT_START_CODE,32); /* extension_start_code */
  85.   putbits(DISP_ID,4); /* extension_start_code_identifier */
  86.   putbits(video_format,3); /* video_format */
  87.   putbits(1,1); /* colour_description */
  88.   putbits(color_primaries,8); /* colour_primaries */
  89.   putbits(transfer_characteristics,8); /* transfer_characteristics */
  90.   putbits(matrix_coefficients,8); /* matrix_coefficients */
  91.   putbits(display_horizontal_size,14); /* display_horizontal_size */
  92.   putbits(1,1); /* marker_bit */
  93.   putbits(display_vertical_size,14); /* display_vertical_size */
  94. }
  95. /* output a zero terminated string as user data (6.2.2.2.2, 6.3.4.1)
  96.  *
  97.  * string must not emulate start codes
  98.  */
  99. void putuserdata(userdata)
  100. char *userdata;
  101. {
  102.   alignbits();
  103.   putbits(USER_START_CODE,32); /* user_data_start_code */
  104.   while (*userdata)
  105.     putbits(*userdata++,8);
  106. }
  107. /* generate group of pictures header (6.2.2.6, 6.3.9)
  108.  *
  109.  * uses tc0 (timecode of first frame) and frame0 (number of first frame)
  110.  */
  111. void putgophdr(frame,closed_gop)
  112. int frame,closed_gop;
  113. {
  114.   int tc;
  115.   alignbits();
  116.   putbits(GOP_START_CODE,32); /* group_start_code */
  117.   tc = frametotc(tc0+frame);
  118.   putbits(tc,25); /* time_code */
  119.   putbits(closed_gop,1); /* closed_gop */
  120.   putbits(0,1); /* broken_link */
  121. }
  122. /* convert frame number to time_code
  123.  *
  124.  * drop_frame not implemented
  125.  */
  126. static int frametotc(frame)
  127. int frame;
  128. {
  129.   int fps, pict, sec, minute, hour, tc;
  130.   fps = (int)(frame_rate+0.5);
  131.   pict = frame%fps;
  132.   frame = (frame-pict)/fps;
  133.   sec = frame%60;
  134.   frame = (frame-sec)/60;
  135.   minute = frame%60;
  136.   frame = (frame-minute)/60;
  137.   hour = frame%24;
  138.   tc = (hour<<19) | (minute<<13) | (1<<12) | (sec<<6) | pict;
  139.   return tc;
  140. }
  141. /* generate picture header (6.2.3, 6.3.10) */
  142. void putpicthdr()
  143. {
  144.   alignbits();
  145.   putbits(PICTURE_START_CODE,32); /* picture_start_code */
  146.   calc_vbv_delay();
  147.   putbits(temp_ref,10); /* temporal_reference */
  148.   putbits(pict_type,3); /* picture_coding_type */
  149.   putbits(vbv_delay,16); /* vbv_delay */
  150.   if (pict_type==P_TYPE || pict_type==B_TYPE)
  151.   {
  152.     putbits(0,1); /* full_pel_forward_vector */
  153.     if (mpeg1)
  154.       putbits(forw_hor_f_code,3);
  155.     else
  156.       putbits(7,3); /* forward_f_code */
  157.   }
  158.   if (pict_type==B_TYPE)
  159.   {
  160.     putbits(0,1); /* full_pel_backward_vector */
  161.     if (mpeg1)
  162.       putbits(back_hor_f_code,3);
  163.     else
  164.       putbits(7,3); /* backward_f_code */
  165.   }
  166.   putbits(0,1); /* extra_bit_picture */
  167. }
  168. /* generate picture coding extension (6.2.3.1, 6.3.11)
  169.  *
  170.  * composite display information (v_axis etc.) not implemented
  171.  */
  172. void putpictcodext()
  173. {
  174.   alignbits();
  175.   putbits(EXT_START_CODE,32); /* extension_start_code */
  176.   putbits(CODING_ID,4); /* extension_start_code_identifier */
  177.   putbits(forw_hor_f_code,4); /* forward_horizontal_f_code */
  178.   putbits(forw_vert_f_code,4); /* forward_vertical_f_code */
  179.   putbits(back_hor_f_code,4); /* backward_horizontal_f_code */
  180.   putbits(back_vert_f_code,4); /* backward_vertical_f_code */
  181.   putbits(dc_prec,2); /* intra_dc_precision */
  182.   putbits(pict_struct,2); /* picture_structure */
  183.   putbits((pict_struct==FRAME_PICTURE)?topfirst:0,1); /* top_field_first */
  184.   putbits(frame_pred_dct,1); /* frame_pred_frame_dct */
  185.   putbits(0,1); /* concealment_motion_vectors  -- currently not implemented */
  186.   putbits(q_scale_type,1); /* q_scale_type */
  187.   putbits(intravlc,1); /* intra_vlc_format */
  188.   putbits(altscan,1); /* alternate_scan */
  189.   putbits(repeatfirst,1); /* repeat_first_field */
  190.   putbits(prog_frame,1); /* chroma_420_type */
  191.   putbits(prog_frame,1); /* progressive_frame */
  192.   putbits(0,1); /* composite_display_flag */
  193. }
  194. /* generate sequence_end_code (6.2.2) */
  195. void putseqend()
  196. {
  197.   alignbits();
  198.   putbits(SEQ_END_CODE,32);
  199. }