gethdr.cc
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:18k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.   File: gethdr.cc
  3. */
  4. #pragma implementation
  5. #include <stdio.h>
  6. #include <fstream.h>
  7. #include <sys/time.h>
  8. #include "athread.hh"
  9. #include "error.hh"
  10. #include "debug.hh"
  11. #include "util.hh"
  12. #include "sync.hh"
  13. #include "mpeg2const.hh"
  14. #include "mpeg2buff.hh"
  15. #include "videoconst.hh"
  16. #include "display.hh"
  17. #include "idct.hh"
  18. #include "vstream.hh"
  19. #include "layerdata.hh"
  20. #include "global.hh"
  21. /* decode headers from one input stream
  22.  * until an End of Sequence or picture start code
  23.  * is found
  24.  */
  25. int LayerData::getheader(){
  26.   unsigned int code;
  27.   static int found_seqhdr=False; 
  28.   // a sequence header should be found before returning from `getheader' the
  29.   // first time (this is to set horizontal/vertical size properly)
  30.   while (1){
  31.     // look for startcode
  32.     code=input->startcode();
  33.     input->flushbits(32);
  34.     switch (code){
  35.     case Sequence_start_code: 
  36.       TRACER("sequence start code");
  37.       found_seqhdr=True;
  38.       getseqhdr();  
  39.       ext_user_data();
  40.       break;
  41.     case Gop_start_code:
  42.       TRACER("gop start code"); 
  43.       getgophdr();
  44.       ext_user_data();
  45.       break;
  46.     case Picture_start_code:
  47.       TRACER("picture start code");
  48.       getpicturehdr();
  49.       ext_user_data();
  50.       if (found_seqhdr) return 1;
  51.       break;
  52.     case Sequence_end_code:
  53.       TRACER("sequence end code");
  54.       return 0;
  55.     default:
  56.       if (!quiet && framerate==0)
  57.         fprintf(stderr,"Unexpected startcode %08x (ignored)n", code);
  58.       break;
  59.     }
  60.   }
  61.   return 0;
  62. }
  63. // decode sequence header
  64. void LayerData::getseqhdr(){
  65.   TRACER("void LayerData::getseqhdr()");
  66.   int i;
  67.   int aspect_ratio, picture_rate, vbv_buffer_size;
  68.   int constrained_parameters_flag;
  69.   int load_intra_quantizer_matrix, load_non_intra_quantizer_matrix;
  70.   int bit_rate;
  71.   int pos=0;
  72.   if (verbose>0)
  73.     pos = input->getposition();
  74.   horizontal_size = input->getbits(12);
  75.   vertical_size = input->getbits(12);
  76.   aspect_ratio = input->getbits(4);
  77.   picture_rate = input->getbits(4);
  78.   bit_rate = input->getbits(18);
  79.   input->flushbits(1); /* marker bit (=1) */
  80.   vbv_buffer_size = input->getbits(10);
  81.   constrained_parameters_flag = input->getbits(1);
  82.   if ((load_intra_quantizer_matrix=input->getbits(1))!=0){
  83.     for (i=0; i<64; i++)
  84.       intra_quantizer_matrix[zig_zag_scan[i]] = input->getbits(8);
  85.   }
  86.   else {
  87.     for (i=0; i<64; i++)
  88.       intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i];
  89.   }
  90.   if ((load_non_intra_quantizer_matrix=input->getbits(1))!=0){
  91.     for (i=0; i<64; i++)
  92.       non_intra_quantizer_matrix[zig_zag_scan[i]] = input->getbits(8);
  93.   }
  94.   else {
  95.     for (i=0; i<64; i++)
  96.       non_intra_quantizer_matrix[i] = 16;
  97.   }
  98.   /* copy luminance to chrominance matrices */
  99.   for (i=0; i<64; i++){
  100.     chroma_intra_quantizer_matrix[i] =
  101.       intra_quantizer_matrix[i];
  102.     chroma_non_intra_quantizer_matrix[i] =
  103.       non_intra_quantizer_matrix[i];
  104.   }
  105.   if (verbose>0){
  106.     printf("sequence header (byte %d)n",(pos>>3)-4);
  107.     if (verbose>1){
  108.       printf("  horizontal_size=%dn",horizontal_size);
  109.       printf("  vertical_size=%dn",vertical_size);
  110.       printf("  aspect_ratio=%dn",aspect_ratio);
  111.       printf("  picture_rate=%dn",picture_rate);
  112.       printf("  bit_rate=%dn",bit_rate);
  113.       printf("  vbv_buffer_size=%dn",vbv_buffer_size);
  114.       printf("  constrained_parameters_flag=%dn",constrained_parameters_flag);
  115.       printf("  load_intra_quantizer_matrix=%dn",load_intra_quantizer_matrix);
  116.       printf("  load_non_intra_quantizer_matrix=%dn",load_non_intra_quantizer_matrix);
  117.     }
  118.   }
  119. }
  120. /* decode group of pictures header */
  121. void LayerData::getgophdr(){
  122.   int drop_flag, hour, minute, sec, frame, closed_gop, broken_link;
  123.   int pos=0;
  124.   if (verbose>0)
  125.     pos = input->getposition();
  126.   drop_flag = input->getbits(1);
  127.   hour = input->getbits(5);
  128.   minute = input->getbits(6);
  129.   input->flushbits(1);
  130.   sec = input->getbits(6);
  131.   frame = input->getbits(6);
  132.   closed_gop = input->getbits(1);
  133.   broken_link = input->getbits(1);
  134.   if (verbose>0){
  135.     printf("group of pictures (byte %d)n",(pos>>3)-4);
  136.     if (verbose>1){
  137.       printf("  drop_flag=%dn",drop_flag);
  138.       printf("  timecode %d:%02d:%02d:%02dn",hour,minute,sec,frame);
  139.       printf("  closed_gop=%dn",closed_gop);
  140.       printf("  broken_link=%dn",broken_link);
  141.     }
  142.   }
  143. }
  144. /* decode picture header */
  145. void LayerData::getpicturehdr(){
  146.   int temp_ref, vbv_delay;
  147.   int pos=0;
  148.   if (verbose>0)
  149.     pos = input->getposition();
  150.   pict_scal = 0; /* unless overwritten by pict. spat. scal. ext. */
  151.   temp_ref = input->getbits(10);
  152.   pict_type = input->getbits(3);
  153.   vbv_delay = input->getbits(16);
  154.   if (pict_type==P_TYPE || pict_type==B_TYPE){
  155.     full_forw = input->getbits(1);
  156.     forw_r_size = input->getbits(3) - 1;
  157.   }
  158.   if (pict_type==B_TYPE){
  159.     full_back = input->getbits(1);
  160.     back_r_size = input->getbits(3) - 1;
  161.   }
  162.   if (verbose>0){
  163.     printf("picture header (byte %d)n",(pos>>3)-4);
  164.     if (verbose>1){
  165.       printf("  temp_ref=%dn",temp_ref);
  166.       printf("  pict_type=%dn",pict_type);
  167.       printf("  vbv_delay=%dn",vbv_delay);
  168.       if (pict_type==P_TYPE || pict_type==B_TYPE){
  169.         printf("  full_forw=%dn",full_forw);
  170.         printf("  forw_r_size=%dn",forw_r_size);
  171.       }
  172.       if (pict_type==B_TYPE){
  173.         printf("  full_back=%dn",full_back);
  174.         printf("  back_r_size=%dn",back_r_size);
  175.       }
  176.     }
  177.   }
  178.   // get extra bit picture
  179.   while (input->getbits(1)) input->flushbits(8);
  180. }
  181. /* decode slice header */
  182. int LayerData::getslicehdr(){
  183.   int slice_vertical_position_extension, intra_slice;
  184.   int pos=0;
  185.   if (verbose>0)
  186.     pos = input->getposition();
  187.   slice_vertical_position_extension=(mpeg2 && vertical_size>2800) ? input->getbits(3) : 0;
  188.   if (scalable_mode==SC_DP) pri_brk = input->getbits(7);
  189.   int qs = input->getbits(5);
  190.   quant_scale= mpeg2 ? (qscale_type ? non_linear_mquant_table[qs] : qs<<1) : qs;
  191.   if (input->getbits(1)){
  192.     intra_slice = input->getbits(1);
  193.     input->flushbits(7);
  194.     ext_bit_info();
  195.   }
  196.   else intra_slice = 0;
  197.   if (verbose>2){
  198.     printf("slice header (byte %d)n",(pos>>3)-4);
  199.     if (verbose>3){
  200.       if (mpeg2 && vertical_size>2800)
  201.         printf("  slice_vertical_position_extension=%dn",slice_vertical_position_extension);
  202.       if (scalable_mode==SC_DP)
  203.         printf("  priority_breakpoint=%dn",pri_brk);
  204.       printf("  quantizer_scale_code=%dn",qs);
  205.     }
  206.   }
  207.   return slice_vertical_position_extension;
  208. }
  209. /* decode extension and user data */
  210. void LayerData::ext_user_data(){
  211.   int code=input->startcode();
  212.   while (code==Ext_start_code || code==User_start_code){
  213.     input->flushbits(32);  
  214.     if (code==Ext_start_code){
  215.       int ext_ID = input->getbits(4);
  216.       switch (ext_ID){
  217.       case SEQ_ID:
  218.         sequence_extension();
  219.         break;
  220.       case DISP_ID:
  221.         sequence_display_extension();
  222.         break;
  223.       case QUANT_ID:
  224.         quant_matrix_extension();
  225.         break;
  226.       case SEQSCAL_ID:
  227.         sequence_scalable_extension();
  228.         break;
  229.       case PANSCAN_ID:
  230.         picture_display_extension();
  231.         break;
  232.       case CODING_ID:
  233.         picture_coding_extension();
  234.         break;
  235.       case SPATSCAL_ID:
  236.         picture_spatial_scalable_extension();
  237.         break;
  238.       case TEMPSCAL_ID:
  239.         picture_temporal_scalable_extension();
  240.         break;
  241.       default:
  242.         fprintf(stderr,"reserved extension start code ID %dn",ext_ID);
  243.         break;
  244.       }
  245.     }
  246.     else {
  247.       if (verbose) printf("user datan");
  248.     }
  249.     code=input->startcode();
  250.   }
  251. }
  252. /* decode sequence extension */
  253. void LayerData::sequence_extension(){
  254.   int prof_lev;
  255.   int horizontal_size_extension, vertical_size_extension;
  256.   int bit_rate_extension, vbv_buffer_size_extension, low_delay;
  257.   int frame_rate_extension_n, frame_rate_extension_d;
  258.   int pos=0;
  259.   if (verbose>0)
  260.     pos = input->getposition();
  261.   mpeg2 = 1;
  262.   scalable_mode = SC_NONE; /* unless overwritten by seq. scal. ext. */
  263.   prof_lev = input->getbits(8);
  264.   prog_seq = input->getbits(1);
  265.   chroma_format = input->getbits(2);
  266.   horizontal_size_extension = input->getbits(2);
  267.   vertical_size_extension = input->getbits(2);
  268.   bit_rate_extension = input->getbits(12);
  269.   input->flushbits(1);
  270.   vbv_buffer_size_extension = input->getbits(8);
  271.   low_delay = input->getbits(1);
  272.   frame_rate_extension_n = input->getbits(2);
  273.   frame_rate_extension_d = input->getbits(5);
  274.   horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff);
  275.   vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff);
  276.   if (verbose>0){
  277.     printf("sequence extension (byte %d)n",(pos>>3)-4);
  278.     if (verbose>1){
  279.       printf("  profile_and_level_indication=%dn",prof_lev);
  280.       if (prof_lev<128){
  281.         printf("    profile=%d, level=%dn",prof_lev>>4,prof_lev&15);
  282.       }
  283.       printf("  progressive_sequence=%dn",prog_seq);
  284.       printf("  chroma_format=%dn",chroma_format);
  285.       printf("  horizontal_size_extension=%dn",horizontal_size_extension);
  286.       printf("  vertical_size_extension=%dn",vertical_size_extension);
  287.       printf("  bit_rate_extension=%dn",bit_rate_extension);
  288.       printf("  vbv_buffer_size_extension=%dn",vbv_buffer_size_extension);
  289.       printf("  low_delay=%dn",low_delay);
  290.       printf("  frame_rate_extension_n=%dn",frame_rate_extension_n);
  291.       printf("  frame_rate_extension_d=%dn",frame_rate_extension_d);
  292.     }
  293.   }
  294. }
  295. /* decode sequence display extension */
  296. void LayerData::sequence_display_extension(){
  297.   int colour_primaries(0), transfer_characteristics(0);
  298.   int display_horizontal_size, display_vertical_size;
  299.   int pos=0;
  300.   if (verbose>0)
  301.      pos = input->getposition();
  302.   
  303.   int video_format = input->getbits(3);
  304.   int colour_description = input->getbits(1);
  305.   if (colour_description){
  306.     colour_primaries = input->getbits(8);
  307.     transfer_characteristics = input->getbits(8);
  308.     matrix_coefficients = input->getbits(8);
  309.   }
  310.   display_horizontal_size = input->getbits(14);
  311.   input->flushbits(1);
  312.   display_vertical_size = input->getbits(14);
  313.   if (verbose>0){
  314.     printf("sequence display extension (byte %d)n",(pos>>3)-4);
  315.     if (verbose>1){
  316.       printf("  video_format=%dn",video_format);
  317.       printf("  colour_description=%dn",colour_description);
  318.       if (colour_description){
  319.         printf("    colour_primaries=%dn",colour_primaries);
  320.         printf("    transfer_characteristics=%dn",transfer_characteristics);
  321.         printf("    matrix_coefficients=%dn",matrix_coefficients);
  322.       }
  323.       printf("  display_horizontal_size=%dn",display_horizontal_size);
  324.       printf("  display_vertical_size=%dn",display_vertical_size);
  325.     }
  326.   }
  327. }
  328. /* decode quant matrix entension */
  329. void LayerData::quant_matrix_extension(){
  330.   int i;
  331.   int load_intra_quantiser_matrix, load_non_intra_quantiser_matrix;
  332.   int load_chroma_intra_quantiser_matrix;
  333.   int load_chroma_non_intra_quantiser_matrix;
  334.   int pos=0;
  335.   if (verbose>0)
  336.       pos=input->getposition();
  337.   if ((load_intra_quantiser_matrix=input->getbits(1))!=0){
  338.     for (i=0; i<64; i++){
  339.       chroma_intra_quantizer_matrix[zig_zag_scan[i]]
  340.       = intra_quantizer_matrix[zig_zag_scan[i]]
  341.       = input->getbits(8);
  342.     }
  343.   }
  344.   if ((load_non_intra_quantiser_matrix=input->getbits(1))!=0){
  345.     for (i=0; i<64; i++){
  346.       chroma_non_intra_quantizer_matrix[zig_zag_scan[i]]
  347.       = non_intra_quantizer_matrix[zig_zag_scan[i]]
  348.       = input->getbits(8);
  349.     }
  350.   }
  351.   if ((load_chroma_intra_quantiser_matrix=input->getbits(1))!=0){
  352.     for (i=0; i<64; i++)
  353.       chroma_intra_quantizer_matrix[zig_zag_scan[i]] = input->getbits(8);
  354.   }
  355.   if ((load_chroma_non_intra_quantiser_matrix=input->getbits(1))!=0){
  356.     for (i=0; i<64; i++)
  357.       chroma_non_intra_quantizer_matrix[zig_zag_scan[i]] = input->getbits(8);
  358.   }
  359.   if (verbose>0){
  360.     printf("quant matrix extension (byte %d)n",(pos>>3)-4);
  361.     printf("  load_intra_quantiser_matrix=%dn", load_intra_quantiser_matrix);
  362.     printf("  load_non_intra_quantiser_matrix=%dn", load_non_intra_quantiser_matrix);
  363.     printf("  load_chroma_intra_quantiser_matrix=%dn", load_chroma_intra_quantiser_matrix);
  364.     printf("  load_chroma_non_intra_quantiser_matrix=%dn", load_chroma_non_intra_quantiser_matrix);
  365.   }
  366. }
  367. /* decode sequence scalable extension */
  368. void LayerData::sequence_scalable_extension(){
  369.   int pos=0;
  370.   if (verbose>0)
  371.      pos = input->getposition();
  372.   scalable_mode = input->getbits(2) + 1; /* add 1 to make SC_DP != SC_NONE */
  373.   int layer_id = input->getbits(4);
  374.   if (scalable_mode==SC_SPAT){
  375.     llw = input->getbits(14); /* lower_layer_prediction_horizontal_size */
  376.     input->flushbits(1);
  377.     llh = input->getbits(14); /* lower_layer_prediction_vertical_size */
  378.     hm = input->getbits(5);
  379.     hn = input->getbits(5);
  380.     vm = input->getbits(5);
  381.     vn = input->getbits(5);
  382.   }
  383.   if (scalable_mode==SC_TEMP)
  384.     error("temporal scalability not implementedn");
  385.   if (verbose>0){
  386.     printf("sequence scalable extension (byte %d)n",(pos>>3)-4);
  387.     if (verbose>1){
  388.       printf("  scalable_mode=%dn",scalable_mode-1);
  389.       printf("  layer_id=%dn",layer_id);
  390.       if (scalable_mode==SC_SPAT){
  391.         printf("    lower_layer_prediction_horiontal_size=%dn",llw);
  392.         printf("    lower_layer_prediction_vertical_size=%dn",llh);
  393.         printf("    horizontal_subsampling_factor_m=%dn",hm);
  394.         printf("    horizontal_subsampling_factor_n=%dn",hn);
  395.         printf("    vertical_subsampling_factor_m=%dn",vm);
  396.         printf("    vertical_subsampling_factor_n=%dn",vn);
  397.       }
  398.     }
  399.   }
  400. }
  401. /* decode picture display extension */
  402. void LayerData::picture_display_extension(){
  403.   int n;
  404.   short frame_centre_horizontal_offset[3];
  405.   short frame_centre_vertical_offset[3];
  406.   int pos=0;
  407.   if (verbose>0)
  408.     pos=input->getposition();
  409.   if (prog_seq || pict_struct!=FRAME_PICTURE) n = 1;
  410.   else n=repeatfirst ? 3 : 2;
  411.   int i;
  412.   for (i=0; i<n; i++){
  413.     frame_centre_horizontal_offset[i] = (short)input->getbits(16);
  414.     input->flushbits(1);
  415.     frame_centre_vertical_offset[i] = (short)input->getbits(16);
  416.     input->flushbits(1);
  417.   }
  418.   if (verbose>0){
  419.     printf("picture display extension (byte %d)n",(pos>>3)-4);
  420.     if (verbose>1){
  421.       for (i=0; i<n; i++){
  422.         printf("  frame_centre_horizontal_offset[%d]=%dn",i,
  423.           frame_centre_horizontal_offset[i]);
  424.         printf("  frame_centre_vertical_offset[%d]=%dn",i,
  425.           frame_centre_vertical_offset[i]);
  426.       }
  427.     }
  428.   }
  429. }
  430. /* decode picture coding extension */
  431. void LayerData::picture_coding_extension(){
  432.   int chroma_420_type, composite_display_flag;
  433.   int v_axis(0), field_sequence(0), sub_carrier(0), burst_amplitude(0), sub_carrier_phase(0);
  434.   int pos=0;
  435.   if (verbose>0)
  436.     pos=input->getposition();
  437.   h_forw_r_size = input->getbits(4) - 1;
  438.   v_forw_r_size = input->getbits(4) - 1;
  439.   h_back_r_size = input->getbits(4) - 1;
  440.   v_back_r_size = input->getbits(4) - 1;
  441.   dc_prec = input->getbits(2);
  442.   pict_struct = input->getbits(2);
  443.   topfirst = input->getbits(1);
  444.   frame_pred_dct = input->getbits(1);
  445.   conceal_mv = input->getbits(1);
  446.   qscale_type = input->getbits(1);
  447.   intravlc = input->getbits(1);
  448.   altscan = input->getbits(1);
  449.   repeatfirst = input->getbits(1);
  450.   chroma_420_type = input->getbits(1);
  451.   prog_frame = input->getbits(1);
  452.   composite_display_flag = input->getbits(1);
  453.   if (composite_display_flag){
  454.     v_axis = input->getbits(1);
  455.     field_sequence = input->getbits(3);
  456.     sub_carrier = input->getbits(1);
  457.     burst_amplitude = input->getbits(7);
  458.     sub_carrier_phase = input->getbits(8);
  459.   }
  460.   if (verbose>0){
  461.     printf("picture coding extension (byte %d)n",(pos>>3)-4);
  462.     if (verbose>1){
  463.       printf("  forward_horizontal_f_code=%dn",h_forw_r_size+1);
  464.       printf("  forward_vertical_f_code=%dn",v_forw_r_size+1);
  465.       printf("  backward_horizontal_f_code=%dn",h_back_r_size+1);
  466.       printf("  backward_vertical_f_code=%dn",v_back_r_size+1);
  467.       printf("  intra_dc_precision=%dn",dc_prec);
  468.       printf("  picture_structure=%dn",pict_struct);
  469.       printf("  top_field_first=%dn",topfirst);
  470.       printf("  frame_pred_frame_dct=%dn",frame_pred_dct);
  471.       printf("  concealment_motion_vectors=%dn",conceal_mv);
  472.       printf("  q_scale_type=%dn",qscale_type);
  473.       printf("  intra_vlc_format=%dn",intravlc);
  474.       printf("  alternate_scan=%dn",altscan);
  475.       printf("  repeat_first_field=%dn",repeatfirst);
  476.       printf("  chroma_420_type=%dn",chroma_420_type);
  477.       printf("  progressive_frame=%dn",prog_frame);
  478.       printf("  composite_display_flag=%dn",composite_display_flag);
  479.       if (composite_display_flag){
  480.         printf("    v_axis=%dn",v_axis);
  481.         printf("    field_sequence=%dn",field_sequence);
  482.         printf("    sub_carrier=%dn",sub_carrier);
  483.         printf("    burst_amplitude=%dn",burst_amplitude);
  484.         printf("    sub_carrier_phase=%dn",sub_carrier_phase);
  485.       }
  486.     }
  487.   }
  488. }
  489. /* decode picture spatial scalable extension */
  490. void LayerData::picture_spatial_scalable_extension(){
  491.   int pos=0;
  492.   if (verbose>0)
  493.     pos = input->getposition();
  494.   pict_scal = 1; /* use spatial scalability in this picture */
  495.   lltempref = input->getbits(10);
  496.   input->flushbits(1);
  497.   llx0 = input->getbits(15);
  498.   if (llx0>=16384) llx0-= 32768;
  499.   input->flushbits(1);
  500.   lly0 = input->getbits(15);
  501.   if (lly0>=16384) lly0-= 32768;
  502.   stwc_table_index = input->getbits(2);
  503.   llprog_frame = input->getbits(1);
  504.   llfieldsel = input->getbits(1);
  505.   if (verbose>0){
  506.     printf("picture spatial scalable extension (byte %d)n",(pos>>3)-4);
  507.     if (verbose>1){
  508.       printf("  lower_layer_temporal_reference=%dn",lltempref);
  509.       printf("  lower_layer_horizontal_offset=%dn",llx0);
  510.       printf("  lower_layer_vertical_offset=%dn",lly0);
  511.       printf("  spatial_temporal_weight_code_table_index=%dn",
  512.         stwc_table_index);
  513.       printf("  lower_layer_progressive_frame=%dn",llprog_frame);
  514.       printf("  lower_layer_deinterlaced_field_select=%dn",llfieldsel);
  515.     }
  516.   }
  517. }
  518. /* decode picture temporal scalable extension
  519.  *
  520.  * not implemented
  521.  */
  522. void LayerData::picture_temporal_scalable_extension(){
  523.   error("temporal scalability not supportedn");
  524. }