gethdr.c
资源名称:mpeg2编解码.zip [点击查看]
上传用户:hkgotone
上传日期:2013-02-17
资源大小:293k
文件大小:29k
源码类别:
Windows Mobile
开发平台:
C/C++
- /* gethdr.c, header decoding */
- /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
- /*
- * Disclaimer of Warranty
- *
- * These software programs are available to the user without any license fee or
- * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
- * any and all warranties, whether express, implied, or statuary, including any
- * implied warranties or merchantability or of fitness for a particular
- * purpose. In no event shall the copyright-holder be liable for any
- * incidental, punitive, or consequential damages of any kind whatsoever
- * arising from the use of these programs.
- *
- * This disclaimer of warranty extends to the user of these programs and user's
- * customers, employees, agents, transferees, successors, and assigns.
- *
- * The MPEG Software Simulation Group does not represent or warrant that the
- * programs furnished hereunder are free of infringement of any third-party
- * patents.
- *
- * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
- * are subject to royalty fees to patent holders. Many of these patents are
- * general enough such that they are unavoidable regardless of implementation
- * design.
- *
- */
- #include <stdio.h>
- #include "config.h"
- #include "global.h"
- /* private prototypes */
- static void sequence_header _ANSI_ARGS_((void));
- static void group_of_pictures_header _ANSI_ARGS_((void));
- static void picture_header _ANSI_ARGS_((void));
- static void extension_and_user_data _ANSI_ARGS_((void));
- static void sequence_extension _ANSI_ARGS_((void));
- static void sequence_display_extension _ANSI_ARGS_((void));
- static void quant_matrix_extension _ANSI_ARGS_((void));
- static void sequence_scalable_extension _ANSI_ARGS_((void));
- static void picture_display_extension _ANSI_ARGS_((void));
- static void picture_coding_extension _ANSI_ARGS_((void));
- static void picture_spatial_scalable_extension _ANSI_ARGS_((void));
- static void picture_temporal_scalable_extension _ANSI_ARGS_((void));
- static int extra_bit_information _ANSI_ARGS_((void));
- static void copyright_extension _ANSI_ARGS_((void));
- static void user_data _ANSI_ARGS_((void));
- static void user_data _ANSI_ARGS_((void));
- /* introduced in September 1995 to assist spatial scalable decoding */
- static void Update_Temporal_Reference_Tacking_Data _ANSI_ARGS_((void));
- /* private variables */
- static int Temporal_Reference_Base = 0;
- static int True_Framenum_max = -1;
- static int Temporal_Reference_GOP_Reset = 0;
- #define RESERVED -1
- static double frame_rate_Table[16] =
- {
- 0.0,
- ((23.0*1000.0)/1001.0),
- 24.0,
- 25.0,
- ((30.0*1000.0)/1001.0),
- 30.0,
- 50.0,
- ((60.0*1000.0)/1001.0),
- 60.0,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED,
- RESERVED
- };
- /*
- * decode headers from one input stream
- * until an End of Sequence or picture start code
- * is found
- */
- int Get_Hdr()
- {
- unsigned int code;
- for (;;)
- {
- /* look for next_start_code */
- next_start_code();
- code = Get_Bits32();
- switch (code)
- {
- case SEQUENCE_HEADER_CODE:
- sequence_header();
- break;
- case GROUP_START_CODE:
- group_of_pictures_header();
- break;
- case PICTURE_START_CODE:
- picture_header();
- return 1;
- break;
- case SEQUENCE_END_CODE:
- return 0;
- break;
- default:
- if (!Quiet_Flag)
- fprintf(stderr,"Unexpected next_start_code %08x (ignored)n",code);
- break;
- }
- }
- }
- /* align to start of next next_start_code */
- void next_start_code()
- {
- /* byte align */
- Flush_Buffer(ld->Incnt&7);
- while (Show_Bits(24)!=0x01L)
- Flush_Buffer(8);
- }
- /* decode sequence header */
- static void sequence_header()
- {
- int i;
- int pos;
- pos = ld->Bitcnt;
- horizontal_size = Get_Bits(12);
- vertical_size = Get_Bits(12);
- aspect_ratio_information = Get_Bits(4);
- frame_rate_code = Get_Bits(4);
- bit_rate_value = Get_Bits(18);
- marker_bit("sequence_header()");
- vbv_buffer_size = Get_Bits(10);
- constrained_parameters_flag = Get_Bits(1);
- if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
- else
- {
- for (i=0; i<64; i++)
- ld->intra_quantizer_matrix[i] = default_intra_quantizer_matrix[i];
- }
- if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
- else
- {
- for (i=0; i<64; i++)
- ld->non_intra_quantizer_matrix[i] = 16;
- }
- /* copy luminance to chrominance matrices */
- for (i=0; i<64; i++)
- {
- ld->chroma_intra_quantizer_matrix[i] =
- ld->intra_quantizer_matrix[i];
- ld->chroma_non_intra_quantizer_matrix[i] =
- ld->non_intra_quantizer_matrix[i];
- }
- #ifdef VERBOSE
- if (Verbose_Flag > NO_LAYER)
- {
- printf("sequence header (byte %d)n",(pos>>3)-4);
- if (Verbose_Flag > SEQUENCE_LAYER)
- {
- printf(" horizontal_size=%dn",horizontal_size);
- printf(" vertical_size=%dn",vertical_size);
- printf(" aspect_ratio_information=%dn",aspect_ratio_information);
- printf(" frame_rate_code=%d",frame_rate_code);
- printf(" bit_rate_value=%dn",bit_rate_value);
- printf(" vbv_buffer_size=%dn",vbv_buffer_size);
- printf(" constrained_parameters_flag=%dn",constrained_parameters_flag);
- printf(" load_intra_quantizer_matrix=%dn",ld->load_intra_quantizer_matrix);
- printf(" load_non_intra_quantizer_matrix=%dn",ld->load_non_intra_quantizer_matrix);
- }
- }
- #endif /* VERBOSE */
- #ifdef VERIFY
- verify_sequence_header++;
- #endif /* VERIFY */
- extension_and_user_data();
- }
- /* decode group of pictures header */
- /* ISO/IEC 13818-2 section 6.2.2.6 */
- static void group_of_pictures_header()
- {
- int pos;
- if (ld == &base)
- {
- Temporal_Reference_Base = True_Framenum_max + 1; /* *CH* */
- Temporal_Reference_GOP_Reset = 1;
- }
- pos = ld->Bitcnt;
- drop_flag = Get_Bits(1);
- hour = Get_Bits(5);
- minute = Get_Bits(6);
- marker_bit("group_of_pictures_header()");
- sec = Get_Bits(6);
- frame = Get_Bits(6);
- closed_gop = Get_Bits(1);
- broken_link = Get_Bits(1);
- #ifdef VERBOSE
- if (Verbose_Flag > NO_LAYER)
- {
- printf("group of pictures (byte %d)n",(pos>>3)-4);
- if (Verbose_Flag > SEQUENCE_LAYER)
- {
- printf(" drop_flag=%dn",drop_flag);
- printf(" timecode %d:%02d:%02d:%02dn",hour,minute,sec,frame);
- printf(" closed_gop=%dn",closed_gop);
- printf(" broken_link=%dn",broken_link);
- }
- }
- #endif /* VERBOSE */
- #ifdef VERIFY
- verify_group_of_pictures_header++;
- #endif /* VERIFY */
- extension_and_user_data();
- }
- /* decode picture header */
- /* ISO/IEC 13818-2 section 6.2.3 */
- static void picture_header()
- {
- int pos;
- int Extra_Information_Byte_Count;
- /* unless later overwritten by picture_spatial_scalable_extension() */
- ld->pict_scal = 0;
- pos = ld->Bitcnt;
- temporal_reference = Get_Bits(10);
- picture_coding_type = Get_Bits(3);
- vbv_delay = Get_Bits(16);
- if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
- {
- full_pel_forward_vector = Get_Bits(1);
- forward_f_code = Get_Bits(3);
- }
- if (picture_coding_type==B_TYPE)
- {
- full_pel_backward_vector = Get_Bits(1);
- backward_f_code = Get_Bits(3);
- }
- #ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture header (byte %d)n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" temporal_reference=%dn",temporal_reference);
- printf(" picture_coding_type=%dn",picture_coding_type);
- printf(" vbv_delay=%dn",vbv_delay);
- if (picture_coding_type==P_TYPE || picture_coding_type==B_TYPE)
- {
- printf(" full_pel_forward_vector=%dn",full_pel_forward_vector);
- printf(" forward_f_code =%dn",forward_f_code);
- }
- if (picture_coding_type==B_TYPE)
- {
- printf(" full_pel_backward_vector=%dn",full_pel_backward_vector);
- printf(" backward_f_code =%dn",backward_f_code);
- }
- }
- }
- #endif /* VERBOSE */
- #ifdef VERIFY
- verify_picture_header++;
- #endif /* VERIFY */
- Extra_Information_Byte_Count =
- extra_bit_information();
- extension_and_user_data();
- /* update tracking information used to assist spatial scalability */
- Update_Temporal_Reference_Tacking_Data();
- }
- /* decode slice header */
- /* ISO/IEC 13818-2 section 6.2.4 */
- int slice_header()
- {
- int slice_vertical_position_extension;
- int quantizer_scale_code;
- int pos;
- int slice_picture_id_enable = 0;
- int slice_picture_id = 0;
- int extra_information_slice = 0;
- pos = ld->Bitcnt;
- slice_vertical_position_extension =
- (ld->MPEG2_Flag && vertical_size>2800) ? Get_Bits(3) : 0;
- if (ld->scalable_mode==SC_DP)
- ld->priority_breakpoint = Get_Bits(7);
- quantizer_scale_code = Get_Bits(5);
- ld->quantizer_scale =
- ld->MPEG2_Flag ? (ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code] : quantizer_scale_code<<1) : quantizer_scale_code;
- /* slice_id introduced in March 1995 as part of the video corridendum
- (after the IS was drafted in November 1994) */
- if (Get_Bits(1))
- {
- ld->intra_slice = Get_Bits(1);
- slice_picture_id_enable = Get_Bits(1);
- slice_picture_id = Get_Bits(6);
- extra_information_slice = extra_bit_information();
- }
- else
- ld->intra_slice = 0;
- #ifdef VERBOSE
- if (Verbose_Flag>PICTURE_LAYER)
- {
- printf("slice header (byte %d)n",(pos>>3)-4);
- if (Verbose_Flag>SLICE_LAYER)
- {
- if (ld->MPEG2_Flag && vertical_size>2800)
- printf(" slice_vertical_position_extension=%dn",slice_vertical_position_extension);
- if (ld->scalable_mode==SC_DP)
- printf(" priority_breakpoint=%dn",ld->priority_breakpoint);
- printf(" quantizer_scale_code=%dn",quantizer_scale_code);
- printf(" slice_picture_id_enable = %dn", slice_picture_id_enable);
- if(slice_picture_id_enable)
- printf(" slice_picture_id = %dn", slice_picture_id);
- }
- }
- #endif /* VERBOSE */
- #ifdef VERIFY
- verify_slice_header++;
- #endif /* VERIFY */
- return slice_vertical_position_extension;
- }
- /* decode extension and user data */
- /* ISO/IEC 13818-2 section 6.2.2.2 */
- static void extension_and_user_data()
- {
- int code,ext_ID;
- next_start_code();
- while ((code = Show_Bits(32))==EXTENSION_START_CODE || code==USER_DATA_START_CODE)
- {
- if (code==EXTENSION_START_CODE)
- {
- Flush_Buffer32();
- ext_ID = Get_Bits(4);
- switch (ext_ID)
- {
- case SEQUENCE_EXTENSION_ID:
- sequence_extension();
- break;
- case SEQUENCE_DISPLAY_EXTENSION_ID:
- sequence_display_extension();
- break;
- case QUANT_MATRIX_EXTENSION_ID:
- quant_matrix_extension();
- break;
- case SEQUENCE_SCALABLE_EXTENSION_ID:
- sequence_scalable_extension();
- break;
- case PICTURE_DISPLAY_EXTENSION_ID:
- picture_display_extension();
- break;
- case PICTURE_CODING_EXTENSION_ID:
- picture_coding_extension();
- break;
- case PICTURE_SPATIAL_SCALABLE_EXTENSION_ID:
- picture_spatial_scalable_extension();
- break;
- case PICTURE_TEMPORAL_SCALABLE_EXTENSION_ID:
- picture_temporal_scalable_extension();
- break;
- case COPYRIGHT_EXTENSION_ID:
- copyright_extension();
- break;
- default:
- fprintf(stderr,"reserved extension start code ID %dn",ext_ID);
- break;
- }
- next_start_code();
- }
- else
- {
- #ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- printf("user datan");
- #endif /* VERBOSE */
- Flush_Buffer32();
- user_data();
- }
- }
- }
- /* decode sequence extension */
- /* ISO/IEC 13818-2 section 6.2.2.3 */
- static void sequence_extension()
- {
- int horizontal_size_extension;
- int vertical_size_extension;
- int bit_rate_extension;
- int vbv_buffer_size_extension;
- int pos;
- /* derive bit position for trace */
- #ifdef VERBOSE
- pos = ld->Bitcnt;
- #endif
- ld->MPEG2_Flag = 1;
- ld->scalable_mode = SC_NONE; /* unless overwritten by sequence_scalable_extension() */
- layer_id = 0; /* unless overwritten by sequence_scalable_extension() */
- profile_and_level_indication = Get_Bits(8);
- progressive_sequence = Get_Bits(1);
- chroma_format = Get_Bits(2);
- horizontal_size_extension = Get_Bits(2);
- vertical_size_extension = Get_Bits(2);
- bit_rate_extension = Get_Bits(12);
- marker_bit("sequence_extension");
- vbv_buffer_size_extension = Get_Bits(8);
- low_delay = Get_Bits(1);
- frame_rate_extension_n = Get_Bits(2);
- frame_rate_extension_d = Get_Bits(5);
- frame_rate = frame_rate_Table[frame_rate_code] *
- ((frame_rate_extension_n+1)/(frame_rate_extension_d+1));
- /* special case for 422 profile & level must be made */
- if((profile_and_level_indication>>7) & 1)
- { /* escape bit of profile_and_level_indication set */
- /* 4:2:2 Profile @ Main Level */
- if((profile_and_level_indication&15)==5)
- {
- profile = PROFILE_422;
- level = MAIN_LEVEL;
- }
- }
- else
- {
- profile = profile_and_level_indication >> 4; /* Profile is upper nibble */
- level = profile_and_level_indication & 0xF; /* Level is lower nibble */
- }
- horizontal_size = (horizontal_size_extension<<12) | (horizontal_size&0x0fff);
- vertical_size = (vertical_size_extension<<12) | (vertical_size&0x0fff);
- /* ISO/IEC 13818-2 does not define bit_rate_value to be composed of
- * both the original bit_rate_value parsed in sequence_header() and
- * the optional bit_rate_extension in sequence_extension_header().
- * However, we use it for bitstream verification purposes.
- */
- bit_rate_value += (bit_rate_extension << 18);
- bit_rate = ((double) bit_rate_value) * 400.0;
- vbv_buffer_size += (vbv_buffer_size_extension << 10);
- #ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("sequence extension (byte %d)n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" profile_and_level_indication=%dn",profile_and_level_indication);
- if (profile_and_level_indication<128)
- {
- printf(" profile=%d, level=%dn",profile,level);
- }
- printf(" progressive_sequence=%dn",progressive_sequence);
- printf(" chroma_format=%dn",chroma_format);
- printf(" horizontal_size_extension=%dn",horizontal_size_extension);
- printf(" vertical_size_extension=%dn",vertical_size_extension);
- printf(" bit_rate_extension=%dn",bit_rate_extension);
- printf(" vbv_buffer_size_extension=%dn",vbv_buffer_size_extension);
- printf(" low_delay=%dn",low_delay);
- printf(" frame_rate_extension_n=%dn",frame_rate_extension_n);
- printf(" frame_rate_extension_d=%dn",frame_rate_extension_d);
- }
- }
- #endif /* VERBOSE */
- #ifdef VERIFY
- verify_sequence_extension++;
- #endif /* VERIFY */
- }
- /* decode sequence display extension */
- static void sequence_display_extension()
- {
- int pos;
- pos = ld->Bitcnt;
- video_format = Get_Bits(3);
- color_description = Get_Bits(1);
- if (color_description)
- {
- color_primaries = Get_Bits(8);
- transfer_characteristics = Get_Bits(8);
- matrix_coefficients = Get_Bits(8);
- }
- display_horizontal_size = Get_Bits(14);
- marker_bit("sequence_display_extension");
- display_vertical_size = Get_Bits(14);
- #ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("sequence display extension (byte %d)n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" video_format=%dn",video_format);
- printf(" color_description=%dn",color_description);
- if (color_description)
- {
- printf(" color_primaries=%dn",color_primaries);
- printf(" transfer_characteristics=%dn",transfer_characteristics);
- printf(" matrix_coefficients=%dn",matrix_coefficients);
- }
- printf(" display_horizontal_size=%dn",display_horizontal_size);
- printf(" display_vertical_size=%dn",display_vertical_size);
- }
- }
- #endif /* VERBOSE */
- #ifdef VERIFY
- verify_sequence_display_extension++;
- #endif /* VERIFY */
- }
- /* decode quant matrix entension */
- /* ISO/IEC 13818-2 section 6.2.3.2 */
- static void quant_matrix_extension()
- {
- int i;
- int pos;
- pos = ld->Bitcnt;
- if((ld->load_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- {
- ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = ld->intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = Get_Bits(8);
- }
- }
- if((ld->load_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- {
- ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = ld->non_intra_quantizer_matrix[scan[ZIG_ZAG][i]]
- = Get_Bits(8);
- }
- }
- if((ld->load_chroma_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->chroma_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
- if((ld->load_chroma_non_intra_quantizer_matrix = Get_Bits(1)))
- {
- for (i=0; i<64; i++)
- ld->chroma_non_intra_quantizer_matrix[scan[ZIG_ZAG][i]] = Get_Bits(8);
- }
- #ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("quant matrix extension (byte %d)n",(pos>>3)-4);
- printf(" load_intra_quantizer_matrix=%dn",
- ld->load_intra_quantizer_matrix);
- printf(" load_non_intra_quantizer_matrix=%dn",
- ld->load_non_intra_quantizer_matrix);
- printf(" load_chroma_intra_quantizer_matrix=%dn",
- ld->load_chroma_intra_quantizer_matrix);
- printf(" load_chroma_non_intra_quantizer_matrix=%dn",
- ld->load_chroma_non_intra_quantizer_matrix);
- }
- #endif /* VERBOSE */
- #ifdef VERIFY
- verify_quant_matrix_extension++;
- #endif /* VERIFY */
- }
- /* decode sequence scalable extension */
- /* ISO/IEC 13818-2 section 6.2.2.5 */
- static void sequence_scalable_extension()
- {
- int pos;
- pos = ld->Bitcnt;
- /* values (without the +1 offset) of scalable_mode are defined in
- Table 6-10 of ISO/IEC 13818-2 */
- ld->scalable_mode = Get_Bits(2) + 1; /* add 1 to make SC_DP != SC_NONE */
- layer_id = Get_Bits(4);
- if (ld->scalable_mode==SC_SPAT)
- {
- lower_layer_prediction_horizontal_size = Get_Bits(14);
- marker_bit("sequence_scalable_extension()");
- lower_layer_prediction_vertical_size = Get_Bits(14);
- horizontal_subsampling_factor_m = Get_Bits(5);
- horizontal_subsampling_factor_n = Get_Bits(5);
- vertical_subsampling_factor_m = Get_Bits(5);
- vertical_subsampling_factor_n = Get_Bits(5);
- }
- if (ld->scalable_mode==SC_TEMP)
- Error("temporal scalability not implementedn");
- #ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("sequence scalable extension (byte %d)n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" scalable_mode=%dn",ld->scalable_mode-1);
- printf(" layer_id=%dn",layer_id);
- if (ld->scalable_mode==SC_SPAT)
- {
- printf(" lower_layer_prediction_horiontal_size=%dn",
- lower_layer_prediction_horizontal_size);
- printf(" lower_layer_prediction_vertical_size=%dn",
- lower_layer_prediction_vertical_size);
- printf(" horizontal_subsampling_factor_m=%dn",
- horizontal_subsampling_factor_m);
- printf(" horizontal_subsampling_factor_n=%dn",
- horizontal_subsampling_factor_n);
- printf(" vertical_subsampling_factor_m=%dn",
- vertical_subsampling_factor_m);
- printf(" vertical_subsampling_factor_n=%dn",
- vertical_subsampling_factor_n);
- }
- }
- }
- #endif /* VERBOSE */
- #ifdef VERIFY
- verify_sequence_scalable_extension++;
- #endif /* VERIFY */
- }
- /* decode picture display extension */
- /* ISO/IEC 13818-2 section 6.2.3.3. */
- static void picture_display_extension()
- {
- int i;
- int number_of_frame_center_offsets;
- int pos;
- pos = ld->Bitcnt;
- /* based on ISO/IEC 13818-2 section 6.3.12
- (November 1994) Picture display extensions */
- /* derive number_of_frame_center_offsets */
- if(progressive_sequence)
- {
- if(repeat_first_field)
- {
- if(top_field_first)
- number_of_frame_center_offsets = 3;
- else
- number_of_frame_center_offsets = 2;
- }
- else
- {
- number_of_frame_center_offsets = 1;
- }
- }
- else
- {
- if(picture_structure!=FRAME_PICTURE)
- {
- number_of_frame_center_offsets = 1;
- }
- else
- {
- if(repeat_first_field)
- number_of_frame_center_offsets = 3;
- else
- number_of_frame_center_offsets = 2;
- }
- }
- /* now parse */
- for (i=0; i<number_of_frame_center_offsets; i++)
- {
- frame_center_horizontal_offset[i] = Get_Bits(16);
- marker_bit("picture_display_extension, first marker bit");
- frame_center_vertical_offset[i] = Get_Bits(16);
- marker_bit("picture_display_extension, second marker bit");
- }
- #ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture display extension (byte %d)n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- for (i=0; i<number_of_frame_center_offsets; i++)
- {
- printf(" frame_center_horizontal_offset[%d]=%dn",i,
- frame_center_horizontal_offset[i]);
- printf(" frame_center_vertical_offset[%d]=%dn",i,
- frame_center_vertical_offset[i]);
- }
- }
- }
- #endif /* VERBOSE */
- #ifdef VERIFY
- verify_picture_display_extension++;
- #endif /* VERIFY */
- }
- /* decode picture coding extension */
- static void picture_coding_extension()
- {
- int pos;
- pos = ld->Bitcnt;
- f_code[0][0] = Get_Bits(4);
- f_code[0][1] = Get_Bits(4);
- f_code[1][0] = Get_Bits(4);
- f_code[1][1] = Get_Bits(4);
- intra_dc_precision = Get_Bits(2);
- picture_structure = Get_Bits(2);
- top_field_first = Get_Bits(1);
- frame_pred_frame_dct = Get_Bits(1);
- concealment_motion_vectors = Get_Bits(1);
- ld->q_scale_type = Get_Bits(1);
- intra_vlc_format = Get_Bits(1);
- ld->alternate_scan = Get_Bits(1);
- repeat_first_field = Get_Bits(1);
- chroma_420_type = Get_Bits(1);
- progressive_frame = Get_Bits(1);
- composite_display_flag = Get_Bits(1);
- if (composite_display_flag)
- {
- v_axis = Get_Bits(1);
- field_sequence = Get_Bits(3);
- sub_carrier = Get_Bits(1);
- burst_amplitude = Get_Bits(7);
- sub_carrier_phase = Get_Bits(8);
- }
- #ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture coding extension (byte %d)n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" forward horizontal f_code=%dn", f_code[0][0]);
- printf(" forward vertical f_code=%dn", f_code[0][1]);
- printf(" backward horizontal f_code=%dn", f_code[1][0]);
- printf(" backward_vertical f_code=%dn", f_code[1][1]);
- printf(" intra_dc_precision=%dn",intra_dc_precision);
- printf(" picture_structure=%dn",picture_structure);
- printf(" top_field_first=%dn",top_field_first);
- printf(" frame_pred_frame_dct=%dn",frame_pred_frame_dct);
- printf(" concealment_motion_vectors=%dn",concealment_motion_vectors);
- printf(" q_scale_type=%dn",ld->q_scale_type);
- printf(" intra_vlc_format=%dn",intra_vlc_format);
- printf(" alternate_scan=%dn",ld->alternate_scan);
- printf(" repeat_first_field=%dn",repeat_first_field);
- printf(" chroma_420_type=%dn",chroma_420_type);
- printf(" progressive_frame=%dn",progressive_frame);
- printf(" composite_display_flag=%dn",composite_display_flag);
- if (composite_display_flag)
- {
- printf(" v_axis=%dn",v_axis);
- printf(" field_sequence=%dn",field_sequence);
- printf(" sub_carrier=%dn",sub_carrier);
- printf(" burst_amplitude=%dn",burst_amplitude);
- printf(" sub_carrier_phase=%dn",sub_carrier_phase);
- }
- }
- }
- #endif /* VERBOSE */
- #ifdef VERIFY
- verify_picture_coding_extension++;
- #endif /* VERIFY */
- }
- /* decode picture spatial scalable extension */
- /* ISO/IEC 13818-2 section 6.2.3.5. */
- static void picture_spatial_scalable_extension()
- {
- int pos;
- pos = ld->Bitcnt;
- ld->pict_scal = 1; /* use spatial scalability in this picture */
- lower_layer_temporal_reference = Get_Bits(10);
- marker_bit("picture_spatial_scalable_extension(), first marker bit");
- lower_layer_horizontal_offset = Get_Bits(15);
- if (lower_layer_horizontal_offset>=16384)
- lower_layer_horizontal_offset-= 32768;
- marker_bit("picture_spatial_scalable_extension(), second marker bit");
- lower_layer_vertical_offset = Get_Bits(15);
- if (lower_layer_vertical_offset>=16384)
- lower_layer_vertical_offset-= 32768;
- spatial_temporal_weight_code_table_index = Get_Bits(2);
- lower_layer_progressive_frame = Get_Bits(1);
- lower_layer_deinterlaced_field_select = Get_Bits(1);
- #ifdef VERBOSE
- if (Verbose_Flag>NO_LAYER)
- {
- printf("picture spatial scalable extension (byte %d)n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" lower_layer_temporal_reference=%dn",lower_layer_temporal_reference);
- printf(" lower_layer_horizontal_offset=%dn",lower_layer_horizontal_offset);
- printf(" lower_layer_vertical_offset=%dn",lower_layer_vertical_offset);
- printf(" spatial_temporal_weight_code_table_index=%dn",
- spatial_temporal_weight_code_table_index);
- printf(" lower_layer_progressive_frame=%dn",lower_layer_progressive_frame);
- printf(" lower_layer_deinterlaced_field_select=%dn",lower_layer_deinterlaced_field_select);
- }
- }
- #endif /* VERBOSE */
- #ifdef VERIFY
- verify_picture_spatial_scalable_extension++;
- #endif /* VERIFY */
- }
- /* decode picture temporal scalable extension
- *
- * not implemented
- */
- /* ISO/IEC 13818-2 section 6.2.3.4. */
- static void picture_temporal_scalable_extension()
- {
- Error("temporal scalability not supportedn");
- #ifdef VERIFY
- verify_picture_temporal_scalable_extension++;
- #endif /* VERIFY */
- }
- /* decode extra bit information */
- /* ISO/IEC 13818-2 section 6.2.3.4. */
- static int extra_bit_information()
- {
- int Byte_Count = 0;
- while (Get_Bits1())
- {
- Flush_Buffer(8);
- Byte_Count++;
- }
- return(Byte_Count);
- }
- /* ISO/IEC 13818-2 section 5.3 */
- /* Purpose: this function is mainly designed to aid in bitstream conformance
- testing. A simple Flush_Buffer(1) would do */
- void marker_bit(text)
- char *text;
- {
- int marker;
- marker = Get_Bits(1);
- #ifdef VERIFY
- if(!marker)
- printf("ERROR: %s--marker_bit set to 0",text);
- #endif
- }
- /* ISO/IEC 13818-2 sections 6.3.4.1 and 6.2.2.2.2 */
- static void user_data()
- {
- /* skip ahead to the next start code */
- next_start_code();
- }
- /* Copyright extension */
- /* ISO/IEC 13818-2 section 6.2.3.6. */
- /* (header added in November, 1994 to the IS document) */
- static void copyright_extension()
- {
- int pos;
- int reserved_data;
- pos = ld->Bitcnt;
- copyright_flag = Get_Bits(1);
- copyright_identifier = Get_Bits(8);
- original_or_copy = Get_Bits(1);
- /* reserved */
- reserved_data = Get_Bits(7);
- marker_bit("copyright_extension(), first marker bit");
- copyright_number_1 = Get_Bits(20);
- marker_bit("copyright_extension(), second marker bit");
- copyright_number_2 = Get_Bits(22);
- marker_bit("copyright_extension(), third marker bit");
- copyright_number_3 = Get_Bits(22);
- if(Verbose_Flag>NO_LAYER)
- {
- printf("copyright_extension (byte %d)n",(pos>>3)-4);
- if (Verbose_Flag>SEQUENCE_LAYER)
- {
- printf(" copyright_flag =%dn",copyright_flag);
- printf(" copyright_identifier=%dn",copyright_identifier);
- printf(" original_or_copy = %d (original=1, copy=0)n",
- original_or_copy);
- printf(" copyright_number_1=%dn",copyright_number_1);
- printf(" copyright_number_2=%dn",copyright_number_2);
- printf(" copyright_number_3=%dn",copyright_number_3);
- }
- }
- #ifdef VERIFY
- verify_copyright_extension++;
- #endif /* VERIFY */
- }
- /* introduced in September 1995 to assist Spatial Scalability */
- static void Update_Temporal_Reference_Tacking_Data()
- {
- static int temporal_reference_wrap = 0;
- static int temporal_reference_old = 0;
- if (ld == &base) /* *CH* */
- {
- if (picture_coding_type!=B_TYPE && temporal_reference!=temporal_reference_old)
- /* check first field of */
- {
- /* non-B-frame */
- if (temporal_reference_wrap)
- {/* wrap occured at previous I- or P-frame */
- /* now all intervening B-frames which could
- still have high temporal_reference values are done */
- Temporal_Reference_Base += 1024;
- temporal_reference_wrap = 0;
- }
- /* distinguish from a reset */
- if (temporal_reference<temporal_reference_old && !Temporal_Reference_GOP_Reset)
- temporal_reference_wrap = 1; /* we must have just passed a GOP-Header! */
- temporal_reference_old = temporal_reference;
- Temporal_Reference_GOP_Reset = 0;
- }
- True_Framenum = Temporal_Reference_Base + temporal_reference;
- /* temporary wrap of TR at 1024 for M frames */
- if (temporal_reference_wrap && temporal_reference <= temporal_reference_old)
- True_Framenum += 1024;
- True_Framenum_max = (True_Framenum > True_Framenum_max) ?
- True_Framenum : True_Framenum_max;
- }
- }