//--------------------------------------------------------------------------- void File_Als::FileHeader_Parse() { //Parsing int32u SampleRate, Samples; int16u Channels; int8u BitsPerSample, FileType; Skip_C4( "signature"); Get_B4 (SampleRate, "sample rate"); Get_B4 (Samples, "samples"); Get_B2 (Channels, "channels-1"); Param_Info2(Channels+1, " channel(s)"); BS_Begin(); Get_S1 (3, FileType, "file type"); // WAV, RIFF, AIFF Get_S1 (3, BitsPerSample, "bits per sample"); Param_Info2((BitsPerSample+1)*8, " bits"); Skip_SB( "floating point"); Skip_SB( "samples are big-endian"); BS_End(); FILLING_BEGIN(); if (!CalcDurationUncompressedSize(Samples, SampleRate, (BitsPerSample+1)*8, Channels)) return; File__Tags_Helper::Accept("ALS"); File__Tags_Helper::Stream_Prepare(Stream_Audio); Fill(Stream_Audio, 0, Audio_Format, "ALS"); Fill(Stream_Audio, 0, Audio_Codec, "ALS"); Fill(Stream_Audio, 0, Audio_BitDepth, (BitsPerSample+1)*8); Fill(Stream_Audio, StreamPos_Last, Audio_Channel_s_, Channels+1); Fill(Stream_Audio, StreamPos_Last, Audio_SamplingRate, SampleRate); Fill(Stream_Audio, 0, Audio_Duration, Duration); //No more need data File__Tags_Helper::Finish("ALS"); FILLING_END(); }
//--------------------------------------------------------------------------- void File_Aac::DSTSpecificConfig() { Element_Begin1("DSTSpecificConfig"); Skip_SB("DSDDST_Coded"); Skip_S2(14,"N_Channels"); Skip_SB("reserved"); Element_End0(); }
//--------------------------------------------------------------------------- // Packet "B0" void File_AvsV::video_sequence_start() { Element_Name("video_sequence_start"); //Parsing int32u bit_rate_upper, bit_rate_lower; Get_B1 ( profile_id, "profile_id"); Get_B1 ( level_id, "level_id"); BS_Begin(); Get_SB ( progressive_sequence, "progressive_sequence"); Get_S2 (14, horizontal_size, "horizontal_size"); Get_S2 (14, vertical_size, "vertical_size"); Get_S1 ( 2, chroma_format, "chroma_format"); Skip_S1( 3, "sample_precision"); Get_S1 ( 4, aspect_ratio, "aspect_ratio"); Param_Info(AvsV_aspect_ratio[aspect_ratio]); Get_S1 ( 4, frame_rate_code, "frame_rate_code"); Param_Info(AvsV_frame_rate[frame_rate_code]); Get_S3 (18, bit_rate_lower, "bit_rate_lower"); Mark_1 (); Get_S3 (12, bit_rate_upper, "bit_rate_upper"); bit_rate=(bit_rate_upper<<18)+bit_rate_lower; Param_Info(bit_rate*8, " bps"); Get_SB ( low_delay, "low_delay"); Mark_1 (); Skip_S3(18, "bbv_buffer_size"); Skip_SB( "reserved"); Skip_SB( "reserved"); Skip_SB( "reserved"); BS_End(); //Not sure, but the 3 first official files have this if (Element_Size-Element_Offset) { BS_Begin(); Mark_1(); BS_End(); } FILLING_BEGIN(); //NextCode NextCode_Clear(); NextCode_Add(0xB2); //user_data_start NextCode_Add(0xB3); //picture_start (I) NextCode_Add(0xB5); //extension_start //Autorisation of other streams Streams[0xB1].Searching_Payload=true, //video_sequence_end Streams[0xB2].Searching_Payload=true; //user_data_start Streams[0xB3].Searching_Payload=true, //picture_start (I) Streams[0xB4].Searching_Payload=true, //reserved Streams[0xB5].Searching_Payload=true; //extension_start Streams[0xB6].Searching_Payload=true, //picture_start (P or B) Streams[0xB7].Searching_Payload=true; //video_edit Streams[0xB8].Searching_Payload=true, //reserved video_sequence_start_IsParsed=true; FILLING_END(); }
//--------------------------------------------------------------------------- void File_Aac::HVXCconfig() { Element_Begin1("HVXCconfig"); Skip_SB( "HVXCvarMode"); Skip_S1(2, "HVXCrateMode"); Skip_SB( "extensionFlag"); //~ if (extensionFlag) { /*< to be defined in MPEG-4 Version 2 >*/ //~ } Element_End0(); }
//--------------------------------------------------------------------------- void File_Cdp::ccsvcinfo_section() { //Parsing int8u svc_count; Element_Begin1("ccsvcinfo_section"); Skip_B1( "ccsvcinfo_id"); BS_Begin(); Skip_SB( "reserved"); Skip_SB( "svc_info_start"); Skip_SB( "svc_info_change"); Skip_SB( "svc_info_complete"); Get_S1 (4, svc_count, "svc_count"); BS_End(); for (int8u Pos=0; Pos<svc_count; Pos++) { Element_Begin1("svc"); bool csn_size; BS_Begin(); Skip_SB( "reserved"); Get_SB ( csn_size, "csn_size"); if (csn_size) { Skip_SB( "reserved"); Skip_S1(5, "caption_service_number"); } else Skip_S1(6, "caption_service_number"); BS_End(); //svc_data_byte - caption_service_descriptor Element_Begin1("service"); Ztring language; bool digital_cc; Get_Local(3, language, "language"); BS_Begin(); Get_SB (digital_cc, "digital_cc"); Skip_SB( "reserved"); if (digital_cc) //line21 { Skip_S1(5, "reserved"); Skip_SB( "line21_field"); } else Skip_S1(6, "caption_service_number"); Skip_SB( "easy_reader"); Skip_SB( "wide_aspect_ratio"); Skip_S2(14, "reserved"); BS_End(); Element_End0(); Element_End0(); } Element_End0(); }
//--------------------------------------------------------------------------- void File_Aac::SLSSpecificConfig() { Element_Begin1("SLSSpecificConfig"); Skip_S1(3,"pcmWordLength"); Skip_SB("aac_core_present"); Skip_SB("lle_main_stream"); Skip_SB("reserved_bit"); Skip_S1(3,"frameLength"); if (!channelConfiguration) program_config_element(); Element_End0(); }
//--------------------------------------------------------------------------- void File_Aac::ErHVXCconfig() { Element_Begin1("ErHVXCconfig"); bool extensionFlag; Skip_SB( "HVXCvarMode"); Skip_S1(2, "HVXCrateMode"); Get_SB (extensionFlag, "extensionFlag"); if (extensionFlag) { Skip_SB( "var_ScalableFlag"); } Element_End0(); }
//--------------------------------------------------------------------------- void File_Cdp::cdp_header() { Element_Begin1("cdp_header"); int16u cdp_identifier; int8u cdp_frame_rate; Get_B2 ( cdp_identifier, "cdp_identifier"); Skip_B1( "cdp_length"); BS_Begin(); Get_S1 (4, cdp_frame_rate, "cdp_frame_rate"); Param_Info1(Ztring::ToZtring(Cdp_cdp_frame_rate(cdp_frame_rate))+__T(" fps")); Skip_S1(4, "Reserved"); Skip_SB( "time_code_present"); Skip_SB( "ccdata_present"); Skip_SB( "svcinfo_present"); Skip_SB( "svc_info_start"); Skip_SB( "svc_info_change"); Skip_SB( "svc_info_complete"); Skip_SB( "caption_service_active"); Skip_SB( "Reserved"); BS_End(); Skip_B2( "cdp_hdr_sequence_cntr"); Element_End0(); FILLING_BEGIN(); if (!Status[IsAccepted]) { if (cdp_identifier!=0x9669) { Reject("CDP"); return; } Accept("CDP"); } FILLING_END(); }
//--------------------------------------------------------------------------- void File_Mpeg4_Descriptors::Descriptor_02() { //Parsing bool URL_Flag; BS_Begin(); Skip_S2(10, "ObjectDescriptorID"); Get_SB ( URL_Flag, "URL_Flag"); Skip_SB( "includeInlineProfileLevelFlag"); Skip_S1( 4, "reserved"); BS_End(); if (URL_Flag) { int8u URLlength; Get_B1 (URLlength, "URLlength"); Skip_UTF8(URLlength, "URLstring"); } Info_B1(ODProfileLevel, "ODProfileLevelIndication"); Param_Info(Mpeg4_Descriptors_ODProfileLevelIndication(ODProfileLevel)); Info_B1(SceneProfileLevel, "sceneProfileLevelIndication"); Param_Info(Mpeg4_Descriptors_SceneProfileLevelIndication(SceneProfileLevel)); Info_B1(AudioProfileLevel, "audioProfileLevelIndication"); Param_Info(Mpeg4_Descriptors_AudioProfileLevelIndication(AudioProfileLevel)); Info_B1(VisualProfileLevel, "visualProfileLevelIndication"); Param_Info(Mpeg4_Descriptors_VisualProfileLevelIndication(VisualProfileLevel)); Info_B1(GraphicsProfileLevel, "graphicsProfileLevelIndication"); Param_Info(Mpeg4_Descriptors_GraphicsProfileLevelIndication(GraphicsProfileLevel)); FILLING_BEGIN(); Element_ThisIsAList(); FILLING_END(); }
//--------------------------------------------------------------------------- void File_Pcm_M2ts::Read_Buffer_Continue() { if (Buffer_Size==0) return; //Parsing int16u audio_data_payload_size; Get_B2 ( audio_data_payload_size, "audio_data_payload_size"); BS_Begin(); Get_S1 (4, channel_assignment, "channel_assignment"); Param_Info2(Pcm_M2TS_channel_assignment[channel_assignment], " channel(s)"); Get_S1 (4, sampling_frequency, "sampling_frequency"); Param_Info2(Pcm_M2TS_sampling_frequency[sampling_frequency], " Hz"); Get_S1 (2, bits_per_sample, "bits_per_sample"); Param_Info2(Pcm_M2TS_bits_per_sample[bits_per_sample], " bits"); Skip_SB( "start_flag"); Skip_S1(5, "reserved"); BS_End(); Skip_XX(audio_data_payload_size, "audio_data_payload"); FILLING_BEGIN_PRECISE(); if (!Status[IsAccepted]) { Accept(); Finish(); } FILLING_END(); }
//--------------------------------------------------------------------------- void File_Amr::Header_Parse() { BS_Begin(); Skip_SB( "Frame Following"); Get_S1 ( 4, FrameType, "Frame Type"); Skip_SB( "Frame Quality"); Skip_SB( "Unknown"); Skip_SB( "Unknown"); BS_End(); //Filling if (Amr_BitRate[FrameType]==0) { Finish("AMR"); return; } Header_Fill_Size(Amr_BitRate[FrameType]/400); Header_Fill_Code(0, "frame"); }
//--------------------------------------------------------------------------- void File_Aac::HILNconfig() { Element_Begin1("HILNconfig"); Skip_SB( "HILNquantMode"); Skip_S1(8, "HILNmaxNumLine"); Skip_S1(4, "HILNsampleRateCode"); Skip_S2(12, "HILNframeLength"); Skip_S1(2, "HILNcontMode"); Element_End0(); }
//--------------------------------------------------------------------------- void File_Aac::ER_SC_CelpHeader () { Element_Begin1("ER_SC_CelpHeader"); bool ExcitationMode; Get_SB(ExcitationMode, "ExcitationMode"); Skip_SB( "SampleRateMode"); Skip_SB( "FineRateControl"); Skip_SB( "SilenceCompression"); if (ExcitationMode == 1/*RPE*/) { Skip_S1(3, "RPE_Configuration"); } if (ExcitationMode == 0/*MPE*/) { Skip_S1(5, "MPE_Configuration"); Skip_S1(2, "NumEnhLayers"); Skip_SB( "BandwidthScalabilityMode"); } Element_End0(); }
//--------------------------------------------------------------------------- // Packet "0E" void File_Vc1::EntryPointHeader() { Element_Name("EntryPointHeader"); //Parsing bool extended_mv; BS_Begin(); Skip_SB( "broken_link"); Skip_SB( "closed_entry"); Get_SB ( panscan_flag, "panscan_flag"); Skip_SB( "refdist_flag"); Skip_SB( "loopfilter"); Skip_SB( "fastuvmc"); Get_SB ( extended_mv, "extended_mv"); Skip_S1( 2, "dquant"); Skip_SB( "vstransform"); Skip_SB( "overlap"); Skip_S1( 2, "quantizer"); if (hrd_param_flag) for (int8u Pos=0; Pos<hrd_num_leaky_buckets; Pos++) { Element_Begin("leaky_bucket"); Skip_S2( 8, "hrd_full"); Element_End(); } TEST_SB_SKIP( "coded_size_flag"); Info_S2(12, coded_width, "coded_width"); Param_Info((coded_width+1)*2, " pixels"); Info_S2(12, coded_height, "coded_height"); Param_Info((coded_height+1)*2, " pixels"); TEST_SB_END(); if (extended_mv) Skip_SB( "extended_dmv"); TEST_SB_SKIP( "luma_sampling"); Skip_S1( 3, "y_range"); TEST_SB_END(); TEST_SB_SKIP( "chroma_sampling"); Skip_S1( 3, "uv_range"); TEST_SB_END(); BS_End(); FILLING_BEGIN(); //NextCode NextCode_Test(); NextCode_Clear(); NextCode_Add(0x0D); //Autorisation of other streams Streams[0x0D].Searching_Payload=true; EntryPoint_Parsed=true; FILLING_END(); }
//--------------------------------------------------------------------------- void File_Cdp::time_code_section() { Element_Begin1("time_code_section"); Skip_B1( "time_code_section_id"); BS_Begin(); Mark_1(); Mark_1(); Skip_S1(2, "tc_10hrs"); Skip_S1(4, "tc_1hrs"); Mark_1(); Skip_S1(3, "tc_10min"); Skip_S1(4, "tc_1min"); Skip_SB( "tc_field_flag"); Skip_S1(3, "tc_10sec"); Skip_S1(4, "tc_1sec"); Skip_SB( "drop_frame_flag"); Mark_0(); Skip_S1(2, "tc_10fr"); Skip_S1(4, "tc_1fr"); BS_End(); Element_End0(); }
//--------------------------------------------------------------------------- void File_Latm::StreamMuxConfig() { Element_Begin("StreamMuxConfig"); bool audioMuxVersion; Get_SB (audioMuxVersion, "audioMuxVersion"); if (audioMuxVersion) Get_SB (audioMuxVersionA, "audioMuxVersionA"); else audioMuxVersionA=false; if (!audioMuxVersionA) { if (audioMuxVersion==1) { //taraBufferFullness=LatmGetValue(); } Skip_SB( "allStreamsSameTimeFraming"); Skip_S1(6, "numSubFrames"); Skip_S1(4, "numProgram"); /* for (int8u prog=0; prog<=numProgram; prog++) { int8u numLayer; Get_S1(3, "numLayer"); for (lay = 0; lay <= numLayer; lay++) { progSIndx[streamCnt] = prog; laySIndx[streamCnt] = lay; streamID [ prog][ lay] = streamCnt++; if (prog == 0 && lay == 0) { useSameConfig = 0; } else { useSameConfig; 1 uimsbf } if (! useSameConfig) { if ( audioMuxVersion == 0 ) { AudioSpecificConfig(); } else { ascLen = LatmGetValue(); ascLen -= AudioSpecificConfig(); Note 1 fillBits; ascLen bslbf } } */ } Element_End(); }
//--------------------------------------------------------------------------- void File_Tak::STREAMINFO() { //Parsing int32u num_samples_hi, samplerate; int8u num_samples_lo, framesizecode, samplesize; bool channels; Skip_L1 ( "unknown"); BS_Begin(); Get_S1 ( 2, num_samples_lo, "num_samples (lo)"); Get_S1 ( 3, framesizecode, "framesizecode"); Skip_S1( 2, "unknown"); BS_End(); Get_L4 (num_samples_hi, "num_samples (hi)"); Param_Info2((((int64u)num_samples_hi)<<2 | num_samples_lo), " samples"); Get_L3 (samplerate, "samplerate"); Param_Info2((samplerate/16)+6000, " Hz"); BS_Begin(); Skip_S1( 4, "unknown"); Get_SB ( channels, "channels"); Param_Info1(channels?"Stereo":"Mono"); Get_S1 ( 2, samplesize, "samplesize"); Param_Info1(Tak_samplesize[samplesize]); Skip_SB( "unknown"); BS_End(); Skip_L3( "crc"); FILLING_BEGIN() //Coherency if (samplerate==0) return; //Computing int64u Samples=((int64u)num_samples_hi)<<2 | num_samples_lo; int32u SamplingRate=(samplerate/16)+6000; //Filling File__Tags_Helper::Accept("TAK"); File__Tags_Helper::Stream_Prepare(Stream_Audio); Fill(Stream_Audio, 0, Audio_Format, "TAK"); Fill(Stream_Audio, 0, Audio_Codec, "TAK"); Fill(Stream_Audio, 0, Audio_SamplingRate, SamplingRate); Fill(Stream_Audio, 0, Audio_Channel_s_, channels?2:1); if (Tak_samplesize[samplesize]) Fill(Stream_Audio, 0, Audio_BitDepth, Tak_samplesize[samplesize]); Fill(Stream_Audio, 0, Audio_Duration, Samples*1000/SamplingRate); FILLING_END(); }
//--------------------------------------------------------------------------- void File_Aac::TTSSpecificConfig() { Element_Begin1("TTSSpecificConfig"); //~ TTS_Sequence() //~ { Skip_S1(5, "TTS_Sequence_ID"); Skip_BS(18, "Language_Code"); Skip_SB( "Gender_Enable"); Skip_SB( "Age_Enable"); Skip_SB( "Speech_Rate_Enable"); Skip_SB( "Prosody_Enable"); Skip_SB( "Video_Enable"); Skip_SB( "Lip_Shape_Enable"); Skip_SB( "Trick_Mode_Enable"); //~ } Element_End0(); }
//--------------------------------------------------------------------------- // Packet "B3" or "B6" void File_AvsV::picture_start() { //Counting if (File_Offset+Buffer_Offset+Element_Size==File_Size) Frame_Count_Valid=Frame_Count; //Finalize frames in case of there are less than Frame_Count_Valid frames Frame_Count++; //Name Element_Name("picture_start"); Element_Info(Ztring::ToZtring(Frame_Count)); if (Element_Code==0xB3) Element_Info(_T("I")); //Parsing int8u picture_coding_type=(int8u)-1; bool time_code_flag, progressive_frame, picture_structure=true, top_field_first, repeat_first_field, skip_mode_flag=false, loop_filter_disable; Skip_B2( "bbv_delay"); BS_Begin(); if (Element_Code==0xB3) //Only I { Get_SB ( time_code_flag, "time_code_flag"); if (time_code_flag) { Skip_SB( "time_code_dropframe"); Skip_S1(5, "time_code_hours"); Skip_S1(6, "time_code_minutes"); Skip_S1(6, "time_code_seconds"); Skip_S1(6, "time_code_pictures"); } } if (Element_Code==0xB6) //Only P or B { Get_S1 ( 2, picture_coding_type, "picture_coding_type"); Element_Info(AvsV_picture_coding_type[picture_coding_type]); } Skip_S1( 8, "picture_distance"); if (low_delay) Skip_UE( "bbv_check_times"); Get_SB ( progressive_frame, "progressive_frame"); if (!progressive_frame) { Get_SB( picture_structure, "picture_structure"); if (Element_Code==0xB6) //Only P or B { if (picture_structure) Skip_SB( "advanced_pred_mode_disable"); } } Get_SB ( top_field_first, "top_field_first"); Get_SB ( repeat_first_field, "repeat_first_field"); Skip_SB( "fixed_picture_qp"); Skip_S1( 6, "picture_qp"); if (Element_Code==0xB3) //Only I { if (!progressive_frame && !picture_structure) Get_SB( skip_mode_flag, "skip_mode_flag"); } if (Element_Code==0xB6) //Only P or B { if (picture_coding_type!=2 || !picture_structure) Skip_SB( "picture_reference_flag"); } Skip_SB( "reserved"); Skip_SB( "reserved"); Skip_SB( "reserved"); Skip_SB( "reserved"); if (Element_Code==0xB6) //Only P or B { Get_SB( skip_mode_flag, "skip_mode_flag"); } Get_SB ( loop_filter_disable, "loop_filter_disable"); if (!loop_filter_disable) { bool loop_filter_parameter_flag; Get_SB ( loop_filter_parameter_flag, "loop_filter_parameter_flag"); if (loop_filter_parameter_flag) { Skip_SE( "alpha_c_offset"); Skip_SE( "beta_offset"); } } BS_End(); if (Element_Size-Element_Offset) Skip_XX(Element_Size-Element_Offset, "Unknown"); FILLING_BEGIN(); if (progressive_frame==false) { if (picture_structure==true) //Frame { if (top_field_first) Interlaced_Top++; else Interlaced_Bottom++; } } else progressive_frame_Count++; //NextCode NextCode_Test(); NextCode_Clear(); for (int8u Pos=0x00; Pos<=0xAF; Pos++) NextCode_Add(Pos); //slice NextCode_Add(0xB0); //video_sequence_start NextCode_Add(0xB3); //picture_start NextCode_Add(0xB6); //picture_start //Autorisation of other streams for (int8u Pos=0x00; Pos<=0xAF; Pos++) Streams[Pos].Searching_Payload=true; //slice //Filling only if not already done if (Frame_Count>=Frame_Count_Valid && Count_Get(Stream_Video)==0) { //No need of more Accept("AVS Video"); Finish("AVS Video"); } FILLING_END(); }
//--------------------------------------------------------------------------- void File_Mpc::FileHeader_Parse() { //Parsing Element_Begin("SV7 header", 21); Ztring Encoder; int32u FrameCount; int16u TitleGain, AlbumGain; int8u Profile, Link, SampleFreq, EncoderVersion; Skip_C3( "Signature"); BS_Begin(); Skip_S1(4, "PNS"); Skip_S1(4, "Version"); BS_End(); Get_L4 (FrameCount, "FrameCount"); Skip_L2( "MaxLevel"); BS_Begin(); Get_S1 (4, Profile, "Profile"); Param_Info(Mpc_Profile[Profile]); Get_S1 (2, Link, "Link"); Param_Info(Mpc_Link[Link]); Get_S1 (2, SampleFreq, "SampleFreq"); Param_Info(Mpc_SampleFreq[SampleFreq]); Skip_SB( "IntensityStereo"); Skip_SB( "MidSideStereo"); Skip_S1(6, "MaxBand"); BS_End(); Skip_L2( "TitlePeak"); Get_L2 (TitleGain, "TitleGain"); Param_Info(((float32)((int16s)TitleGain))/1000, 2, " dB"); Skip_L2( "AlbumPeak"); Get_L2 (AlbumGain, "AlbumGain"); Param_Info(((float32)((int16s)TitleGain))/1000, 2, " dB"); BS_Begin(); Skip_S2(16, "unused"); Skip_S1( 4, "LastFrameLength (part 1)"); Skip_SB( "FastSeekingSafe"); Skip_S1( 3, "unused"); Skip_SB( "TrueGapless"); Skip_S1( 7, "LastFrameLength (part 2)"); BS_End(); Get_L1 (EncoderVersion, "EncoderVersion"); Encoder.From_Number(((float)EncoderVersion)/100, 2); if (EncoderVersion%10==0); else if (EncoderVersion%2==0) Encoder+=_T(" Beta"); else if (EncoderVersion%2==1) Encoder+=_T(" Alpha"); Param_Info(Encoder); Element_End(); FILLING_BEGIN(); File__Tags_Helper::Accept("Musepack SV7"); File__Tags_Helper::Stream_Prepare(Stream_Audio); Fill(Stream_Audio, 0, Audio_SamplingRate, Mpc_SampleFreq[SampleFreq]); Fill(Stream_Audio, 0, Audio_SamplingCount, FrameCount*1152); Fill(Stream_Audio, 0, Audio_Format, "Musepack SV7"); Fill(Stream_Audio, 0, Audio_Codec, "SV7"); Fill(Stream_Audio, 0, Audio_Codec_Settings, Mpc_Profile[Profile]); Fill(Stream_Audio, 0, Audio_Encoded_Library, Encoder); Fill(Stream_Audio, 0, Audio_Resolution, 16); //MPC support only 16 bits Fill(Stream_Audio, 0, Audio_Duration, ((int64u)FrameCount)*1152*1000/Mpc_SampleFreq[SampleFreq]); if (FrameCount) Fill(Stream_Audio, 0, Audio_BitRate, (File_Size-25)*8*Mpc_SampleFreq[SampleFreq]/FrameCount/1152); //No more need data File__Tags_Helper::Finish("Musepack SV7"); FILLING_END(); }
//--------------------------------------------------------------------------- // Packet "B5" void File_AvsV::extension_start() { Element_Name("Extension"); //Parsing int8u extension_start_code_identifier; BS_Begin(); Get_S1 ( 4, extension_start_code_identifier, "extension_start_code_identifier"); Param_Info(AvsV_extension_start_code_identifier[extension_start_code_identifier]); Element_Info(AvsV_extension_start_code_identifier[extension_start_code_identifier]); switch (extension_start_code_identifier) { case 2 :{ //sequence_display //Parsing Get_S1 ( 3, video_format, "video_format"); Param_Info(AvsV_video_format[video_format]); Skip_SB( "sample_range"); TEST_SB_SKIP( "colour_description"); Skip_S1( 8, "colour_primaries"); Skip_S1( 8, "transfer_characteristics"); Skip_S1( 8, "matrix_coefficients"); TEST_SB_END(); Get_S2 (14, display_horizontal_size, "display_horizontal_size"); Mark_1 (); Get_S2 (14, display_vertical_size, "display_vertical_size"); Skip_SB( "reserved"); Skip_SB( "reserved"); BS_End(); } break; case 4 :{ //copyright //Parsing Skip_SB( "copyright_flag"); Skip_S1( 8, "copyright_id"); Skip_SB( "original_or_copy"); Skip_S1( 7, "reserved"); Mark_1 (); Info_S3(20, copyright_number_1, "copyright_number_1"); Mark_1 (); Info_S3(22, copyright_number_2, "copyright_number_2"); Mark_1 (); Info_S3(22, copyright_number_3, "copyright_number_3"); Param_Info(Ztring::ToZtring(((int64u)copyright_number_1<<44)+((int64u)copyright_number_2<<22)+(int64u)copyright_number_3, 16)); BS_End(); } break; case 11 :{ //camera_parameters //Parsing Skip_SB( "reserved"); Skip_S1( 7, "camera_id"); Mark_1 (); Skip_S3(22, "height_of_image_device"); Mark_1 (); Skip_S3(22, "focal_length"); Mark_1 (); Skip_S3(22, "f_number"); Mark_1 (); Skip_S3(22, "vertical_angle_of_view"); Mark_1 (); Skip_S3(16, "camera_position_x_upper"); Mark_1 (); Skip_S3(16, "camera_position_x_lower"); Mark_1 (); Skip_S3(16, "camera_position_y_upper"); Mark_1 (); Skip_S3(16, "camera_position_y_lower"); Mark_1 (); Skip_S3(16, "camera_position_z_upper"); Mark_1 (); Skip_S3(16, "camera_position_z_lower"); Mark_1 (); Skip_S3(22, "camera_direction_x"); Mark_1 (); Skip_S3(22, "camera_direction_y"); Mark_1 (); Skip_S3(22, "camera_direction_z"); Mark_1 (); Skip_S3(22, "camera_plane_vertical_x"); Mark_1 (); Skip_S3(22, "camera_plane_vertical_y"); Mark_1 (); Skip_S3(22, "camera_plane_vertical_z"); Mark_1 (); Skip_S4(32, "reserved"); BS_End(); } break; default:{ //Parsing Skip_S1(4, "data"); BS_End(); Skip_XX(Element_Size-Element_Offset, "data"); } } //Not sure, but the 3 first official files have this if (Element_Size-Element_Offset) { BS_Begin(); Mark_1(); BS_End(); } FILLING_BEGIN(); //NextCode NextCode_Test(); FILLING_END(); }
//--------------------------------------------------------------------------- void File_Mpeg4_Descriptors::Descriptor_06() { //Parsing int8u predefined, timeStampLength; bool durationFlag, useTimeStampsFlag; Get_B1 (predefined, "predefined"); Param_Info(Mpeg4_Descriptors_Predefined(predefined)); switch (predefined) { case 0x00 : { BS_Begin(); Skip_SB( "useAccessUnitStartFlag"); Skip_SB( "useAccessUnitEndFlag"); Skip_SB( "useRandomAccessPointFlag"); Skip_SB( "hasRandomAccessUnitsOnlyFlag"); Skip_SB( "usePaddingFlag"); Get_SB (useTimeStampsFlag, "useTimeStampsFlag"); Skip_SB( "useIdleFlag"); Get_SB (durationFlag, "durationFlag"); BS_End(); Skip_B4( "timeStampResolution"); Skip_B4( "OCRResolution"); Get_B1 (timeStampLength, "timeStampLength"); Skip_B1( "OCRLength"); Skip_B1( "AU_Length"); Skip_B1( "instantBitrateLength"); BS_Begin(); Skip_S1(4, "degradationPriorityLength"); Skip_S1(5, "AU_seqNumLength"); Skip_S1(5, "packetSeqNumLength"); Skip_S1(2, "reserved"); BS_End(); } break; case 0x01 : useTimeStampsFlag=false; durationFlag=false; timeStampLength=32; break; case 0x02 : useTimeStampsFlag=true; durationFlag=false; timeStampLength=32; break; default : useTimeStampsFlag=false; durationFlag=false; timeStampLength=32; } if (durationFlag) { Skip_B4( "timeScale"); Skip_B2( "accessUnitDuration"); Skip_B2( "compositionUnitDuration"); } if (!useTimeStampsFlag) { BS_Begin(); Skip_S8(timeStampLength, "startDecodingTimeStamp"); Skip_S8(timeStampLength, "startCompositionTimeStamp"); BS_End(); } }
//--------------------------------------------------------------------------- void File_Jpeg::SIZ() { //Parsing vector<float> SamplingFactors; vector<int8u> BitDepths; int8u SamplingFactors_Max=0; int32u Xsiz, Ysiz; int16u Count; Skip_B2( "Rsiz - Capability of the codestream"); Get_B4 (Xsiz, "Xsiz - Image size X"); Get_B4 (Ysiz, "Ysiz - Image size Y"); Skip_B4( "XOsiz - Image offset X"); Skip_B4( "YOsiz - Image offset Y"); Skip_B4( "tileW - Size of tile W"); Skip_B4( "tileH - Size of tile H"); Skip_B4( "XTOsiz - Upper-left tile offset X"); Skip_B4( "YTOsiz - Upper-left tile offset Y"); Get_B2 (Count, "Components and initialize related arrays"); for (int16u Pos=0; Pos<Count; Pos++) { Element_Begin1("Initialize related array"); int8u BitDepth = 0, compSubsX = 0, compSubsY = 0; BS_Begin(); Skip_SB( "Signed"); Get_S1 (7, BitDepth, "BitDepth"); Param_Info1(1+BitDepth); Element_Info1(1+BitDepth); BS_End(); Get_B1 ( compSubsX, "compSubsX"); Element_Info1(compSubsX); Get_B1 ( compSubsY, "compSubsY"); Element_Info1(compSubsY); Element_End0(); //Filling list of HiVi if (compSubsX) { SamplingFactors.push_back(((float)compSubsY)/compSubsX); if (((float)compSubsY)/compSubsX>SamplingFactors_Max) SamplingFactors_Max=(int8u)((float)compSubsY)/compSubsX; } if (BitDepths.empty() || BitDepth!=BitDepths[0]) BitDepths.push_back(BitDepth); } FILLING_BEGIN_PRECISE(); if (Frame_Count==0 && Field_Count==0) { Accept("JPEG 2000"); if (Count_Get(StreamKind_Last)==0) Stream_Prepare(StreamKind_Last); Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_Format), "JPEG 2000"); Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_Codec), "JPEG 2000"); if (StreamKind_Last==Stream_Image) Fill(Stream_Image, 0, Image_Codec_String, "JPEG 2000", Unlimited, true, true); //To Avoid automatic filling Fill(StreamKind_Last, 0, StreamKind_Last==Stream_Image?(size_t)Image_Width:(size_t)Video_Width, Xsiz); Fill(StreamKind_Last, 0, StreamKind_Last==Stream_Image?(size_t)Image_Height:(size_t)Video_Height, Ysiz*(Interlaced?2:1)); //If image is from interlaced content, must multiply height by 2 if (BitDepths.size()==1) Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_BitDepth), 1+BitDepths[0]); //Chroma subsampling if (SamplingFactors_Max) while (SamplingFactors_Max<4) { for (size_t Pos=0; Pos<SamplingFactors.size(); Pos++) SamplingFactors[Pos]*=2; SamplingFactors_Max*=2; } while (SamplingFactors.size()<3) SamplingFactors.push_back(0); Ztring ChromaSubsampling; for (size_t Pos=0; Pos<SamplingFactors.size(); Pos++) ChromaSubsampling+=Ztring::ToZtring(SamplingFactors[Pos], 0)+__T(':'); if (!ChromaSubsampling.empty()) { ChromaSubsampling.resize(ChromaSubsampling.size()-1); Fill(StreamKind_Last, 0, "ChromaSubsampling", ChromaSubsampling); } } FILLING_END(); }
//--------------------------------------------------------------------------- void File_Dts::Header_Parse() { //Parsing int16u Primary_Frame_Byte_Size_minus_1; int8u EncoderSoftwareRevision; bool crc_present; Skip_B4( "Sync"); BS_Begin(); Info_SB( FrameType, "Frame Type"); Param_Info(DTS_FrameType[FrameType]); Skip_S1( 5, "Deficit Sample Count"); Get_SB ( crc_present, "CRC Present"); Skip_S1( 7, "Number of PCM Sample Blocks"); Get_S2 (14, Primary_Frame_Byte_Size_minus_1, "Primary Frame Byte Size minus 1"); Primary_Frame_Byte_Size_minus_1+=1; if (!Word) Primary_Frame_Byte_Size_minus_1=Primary_Frame_Byte_Size_minus_1*8/14*2; Param_Info(Ztring::ToZtring(Primary_Frame_Byte_Size_minus_1)+_T(" bytes")); //Word is on 14 bits! Get_S1 ( 6, channel_arrangement, "Audio Channel Arrangement"); Param_Info(Ztring::ToZtring(DTS_Channels[channel_arrangement])+_T(" channels")); Get_S1 ( 4, sample_frequency, "Core Audio Sampling Frequency"); Param_Info(Ztring::ToZtring(DTS_SamplingRate[sample_frequency])+_T(" Hz")); Get_S1 ( 5, bit_rate, "Transmission Bit Rate"); Param_Info(Ztring::ToZtring(DTS_BitRate[bit_rate])+_T(" bps")); Skip_SB( "Embedded Down Mix Enabled"); Skip_SB( "Embedded Dynamic Range"); Skip_SB( "Embedded Time Stamp"); Skip_SB( "Auxiliary Data"); Skip_SB( "HDCD"); Get_S1 ( 3, ExtensionAudioDescriptor, "Extension Audio Descriptor"); Param_Info(DTS_ExtensionAudioDescriptor[ExtensionAudioDescriptor]); Get_SB ( ExtendedCoding, "Extended Coding"); Skip_SB( "Audio Sync Word Insertion"); Get_S1 ( 2, lfe_effects, "Low Frequency Effects"); Skip_SB( "Predictor History"); if (crc_present) Skip_S2(16, "Header CRC Check"); Skip_SB( "Multirate Interpolator"); Get_S1 ( 4, EncoderSoftwareRevision, "Encoder Software Revision"); Skip_S1( 2, "Copy History"); Get_S1 ( 2, bits_per_sample, "Source PCM Resolution"); Param_Info(Ztring::ToZtring(DTS_Resolution[bits_per_sample])+_T(" bits")); Skip_SB( "ES"); Skip_SB( "Front Sum/Difference"); Skip_SB( "Surrounds Sum/Difference"); Skip_S1( 4, "Dialog Normalisation Parameter"); switch (EncoderSoftwareRevision) { case 6 : Skip_S1( 4, "Dialog Normalisation Parameter"); break; case 7 : Skip_S1( 4, "Dialog Normalisation Parameter"); break; default : Skip_S1( 4, "Unspecified"); break; } BS_End(); //Filling Header_Fill_Size(Primary_Frame_Byte_Size_minus_1+DTS_HD_Unknown_Size); //TODO: change this, for DTS-HD Header_Fill_Code(0, "Frame"); }
//--------------------------------------------------------------------------- void File_Mpeg4_Descriptors::Descriptor_04() { //Parsing int32u bufferSizeDB, MaxBitrate, AvgBitrate; Get_B1 (ObjectTypeId, "objectTypeIndication"); Param_Info(Mpeg4_Descriptors_ObjectTypeIndication(ObjectTypeId)); BS_Begin(); Info_S1(6, streamType, "streamType"); Param_Info(Mpeg4_Descriptors_StreamType(streamType)); Skip_SB( "upStream"); Skip_SB( "reserved"); BS_End(); Get_B3 (bufferSizeDB, "bufferSizeDB"); Get_B4 (MaxBitrate, "maxBitrate"); Get_B4 (AvgBitrate, "avgBitrate"); FILLING_BEGIN(); switch (ObjectTypeId) { case 0x01 : Fill(StreamKind_Last, StreamPos_Last, "Format", "System", Error, false, true); break; case 0x02 : Fill(StreamKind_Last, StreamPos_Last, "Format", "System Core", Error, false, true); break; //case 0x03 Interaction Stream //case 0x05 AFX //case 0x06 Font Data //case 0x07 Synthesized Texture Stream case 0x08 : Fill(StreamKind_Last, StreamPos_Last, "Format", "Streaming Text", Error, false, true); break; case 0x20 : Fill(StreamKind_Last, StreamPos_Last, "Format", "MPEG-4 Visual", Error, false, true); break; case 0x21 : Fill(StreamKind_Last, StreamPos_Last, "Format", "AVC", Error, false, true); break; //case 0x22 Parameter Sets for AVC case 0x40 : Fill(StreamKind_Last, StreamPos_Last, "Format", "AAC", Error, false, true); break; //MPEG-4 AAC case 0x60 : Fill(StreamKind_Last, StreamPos_Last, "Format", "MPEG Video", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Profile", "Simple" , Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Version", "Version 2", Error, false, true); break; //MPEG-2V Simple case 0x61 : Fill(StreamKind_Last, StreamPos_Last, "Format", "MPEG Video", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Profile", "Main" , Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Version", "Version 2", Error, false, true); break; //MPEG-2V Main case 0x62 : Fill(StreamKind_Last, StreamPos_Last, "Format", "MPEG Video", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Profile", "SNR" , Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Version", "Version 2", Error, false, true); break; //MPEG-2V SNR case 0x63 : Fill(StreamKind_Last, StreamPos_Last, "Format", "MPEG Video", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Profile", "Spatial", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Version", "Version 2", Error, false, true); break; //MPEG-2V Spatial case 0x64 : Fill(StreamKind_Last, StreamPos_Last, "Format", "MPEG Video", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Profile", "High" , Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Version", "Version 2", Error, false, true); break; //MPEG-2V High case 0x65 : Fill(StreamKind_Last, StreamPos_Last, "Format", "MPEG Video", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Profile", "4:2:2" , Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Version", "Version 2", Error, false, true); break; //MPEG-2V 4:2:2 case 0x66 : Fill(StreamKind_Last, StreamPos_Last, "Format", "AAC", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Profile", "Main", Error, false, true); break; //MPEG-2 AAC Main case 0x67 : Fill(StreamKind_Last, StreamPos_Last, "Format", "AAC", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Profile", "LC", Error, false, true); break; //MPEG-2 AAC LC case 0x68 : Fill(StreamKind_Last, StreamPos_Last, "Format", "AAC", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Profile", "SSR", Error, false, true); break; //MPEG-2 AAC SSR case 0x69 : Fill(StreamKind_Last, StreamPos_Last, "Format", "MPEG Audio", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Profile", "Layer 3", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Version", "Version 2", Error, false, true); break; case 0x6A : Fill(StreamKind_Last, StreamPos_Last, "Format", "MPEG Video", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Version", "Version 1", Error, false, true); break; case 0x6B : Fill(StreamKind_Last, StreamPos_Last, "Format", "MPEG Audio", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "Format_Version", "Version 1", Error, false, true); break; case 0x6C : Fill(StreamKind_Last, StreamPos_Last, "Format", "M-JPEG", Error, false, true); break; case 0x6D : Fill(StreamKind_Last, StreamPos_Last, "Format", "PNG", Error, false, true); break; case 0x6E : Fill(StreamKind_Last, StreamPos_Last, "Format", "MPEG Video", Error, false, true); break; case 0xA0 : Fill(StreamKind_Last, StreamPos_Last, "Format", "EVRC", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "SamplingRate", "8000"); Fill(StreamKind_Last, StreamPos_Last, "Channel(s)", "1", 10, true); break; case 0xA1 : Fill(StreamKind_Last, StreamPos_Last, "Format", "SMV", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "SamplingRate", "8000"); Fill(StreamKind_Last, StreamPos_Last, "Channel(s)", "1", 10, true); break; case 0xA2 : Fill(StreamKind_Last, StreamPos_Last, "Format", "3GPP2", Error, false, true); break; case 0xA3 : Fill(StreamKind_Last, StreamPos_Last, "Format", "VC-1", Error, false, true); break; case 0xA4 : Fill(StreamKind_Last, StreamPos_Last, "Format", "Dirac", Error, false, true); break; case 0xA5 : Fill(StreamKind_Last, StreamPos_Last, "Format", "AC-3", Error, false, true); break; case 0xA6 : Fill(StreamKind_Last, StreamPos_Last, "Format", "E-AC-3", Error, false, true); break; case 0xD1 : Fill(StreamKind_Last, StreamPos_Last, "Format", "EVRC", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "SamplingRate", "8000"); Fill(StreamKind_Last, StreamPos_Last, "Channel(s)", "1", 10, true); break; case 0xD3 : Fill(StreamKind_Last, StreamPos_Last, "Format", "AC-3", Error, false, true); break; case 0xD4 : Fill(StreamKind_Last, StreamPos_Last, "Format", "DTS", Error, false, true); break; case 0xDD : Fill(StreamKind_Last, StreamPos_Last, "Format", "Ogg", Error, false, true); break; case 0xDE : Fill(StreamKind_Last, StreamPos_Last, "Format", "Ogg", Error, false, true); break; case 0xE1 : Fill(StreamKind_Last, StreamPos_Last, "Format", "QCELP", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "SamplingRate", "8000"); Fill(StreamKind_Last, StreamPos_Last, "Channel(s)", "1", 10, true); break; default: ; } switch (ObjectTypeId) { case 0x01 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "System", Error, false, true); break; case 0x02 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "System Core", Error, false, true); break; case 0x20 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-4V", Error, false, true); break; case 0x21 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "H264", Error, false, true); break; case 0x40 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "AAC", Error, false, true); break; //MPEG-4 AAC case 0x60 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-2V", Error, false, true); break; //MPEG-2V Simple case 0x61 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-2V", Error, false, true); break; //MPEG-2V Main case 0x62 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-2V", Error, false, true); break; //MPEG-2V SNR case 0x63 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-2V", Error, false, true); break; //MPEG-2V Spatial case 0x64 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-2V", Error, false, true); break; //MPEG-2V High case 0x65 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-2V", Error, false, true); break; //MPEG-2V 4:2:2 case 0x66 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "AAC", Error, false, true); break; //MPEG-2 AAC Main case 0x67 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "AAC", Error, false, true); break; //MPEG-2 AAC LC case 0x68 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "AAC", Error, false, true); break; //MPEG-2 AAC SSR case 0x69 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-2A L3", Error, false, true); break; case 0x6A : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-1V", Error, false, true); break; case 0x6B : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-1A", Error, false, true); break; case 0x6C : Fill(StreamKind_Last, StreamPos_Last, "Codec", "M-JPEG", Error, false, true); break; case 0x6D : Fill(StreamKind_Last, StreamPos_Last, "Codec", "PNG", Error, false, true); break; case 0x6E : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-4V", Error, false, true); break; case 0xA0 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "EVRC", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "SamplingRate", "8000"); Fill(StreamKind_Last, StreamPos_Last, "Channel(s)", "1", 10, true); break; case 0xA1 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "SMV", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "SamplingRate", "8000"); Fill(StreamKind_Last, StreamPos_Last, "Channel(s)", "1", 10, true); break; case 0xA2 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "MPEG-4V", Error, false, true); break; case 0xA3 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "VC-1", Error, false, true); break; case 0xA4 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "Dirac", Error, false, true); break; case 0xA5 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "AC3", Error, false, true); break; case 0xA6 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "AC3+", Error, false, true); break; case 0xD1 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "EVRC", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "SamplingRate", "8000"); Fill(StreamKind_Last, StreamPos_Last, "Channel(s)", "1", 10, true); break; case 0xD3 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "AC3", Error, false, true); break; case 0xD4 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "DTS", Error, false, true); break; case 0xDD : Fill(StreamKind_Last, StreamPos_Last, "Codec", "Ogg", Error, false, true); break; case 0xDE : Fill(StreamKind_Last, StreamPos_Last, "Codec", "Ogg", Error, false, true); break; case 0xE1 : Fill(StreamKind_Last, StreamPos_Last, "Codec", "QCELP", Error, false, true); Fill(StreamKind_Last, StreamPos_Last, "SamplingRate", "8000"); Fill(StreamKind_Last, StreamPos_Last, "Channel(s)", "1", 10, true); break; default: ; } Fill(StreamKind_Last, StreamPos_Last, "CodecID", ObjectTypeId, 16, true); Fill(StreamKind_Last, StreamPos_Last, "Codec/CC", ObjectTypeId, 16, true); //Bitrate mode if (AvgBitrate>0 && !(bufferSizeDB==AvgBitrate && bufferSizeDB==MaxBitrate && bufferSizeDB==0x1000)) //Some buggy data were found { Fill(StreamKind_Last, StreamPos_Last, "BitRate_Nominal", AvgBitrate); if (MaxBitrate<=AvgBitrate*1.005) Fill(StreamKind_Last, StreamPos_Last, "BitRate_Mode", "CBR"); else { Fill(StreamKind_Last, StreamPos_Last, "BitRate_Mode", "VBR"); Fill(StreamKind_Last, StreamPos_Last, "BitRate_Maximum", MaxBitrate); } } //Creating parser delete Parser; //Parser=NULL; switch (ObjectTypeId) { case 0x20 : //MPEG-4 Visual #if defined(MEDIAINFO_MPEG4V_YES) Parser=new File_Mpeg4v; ((File_Mpeg4v*)Parser)->Frame_Count_Valid=1; ((File_Mpeg4v*)Parser)->FrameIsAlwaysComplete=true; #endif break; case 0x21 : //AVC #if defined(MEDIAINFO_AVC_YES) Parser=new File_Avc; ((File_Avc*)Parser)->MustParse_SPS_PPS=true; ((File_Avc*)Parser)->MustSynchronize=false; ((File_Avc*)Parser)->SizedBlocks=true; #endif break; case 0x40 : #if defined(MEDIAINFO_MPEG4_YES) Parser=new File_Mpeg4_AudioSpecificConfig; #endif break; case 0x60 : case 0x61 : case 0x62 : case 0x63 : case 0x64 : case 0x65 : case 0x6A : //MPEG Video #if defined(MEDIAINFO_MPEGV_YES) Parser=new File_Mpegv; ((File_Mpegv*)Parser)->Frame_Count_Valid=30; //For searching Pulldown ((File_Mpegv*)Parser)->FrameIsAlwaysComplete=true; #endif break; case 0x66 : case 0x67 : case 0x68 : //MPEG-2 AAC #if defined(MEDIAINFO_MPEG4_YES) Parser=new File_Mpeg4_AudioSpecificConfig; //Should be ADIF, but the only sample I have is AudioSpecificConfig #endif break; case 0x69 : case 0x6B : //MPEG Audio #if defined(MEDIAINFO_MPEGA_YES) Parser=new File_Mpega; #endif break; case 0x6C : //M-JPEG #if defined(MEDIAINFO_JPEG_YES) Parser=new File_Jpeg; ((File_Jpeg*)Parser)->StreamKind=Stream_Video; #endif break; case 0x6D : //PNG #if defined(MEDIAINFO_PNG_YES) Parser=new File_Png; #endif break; case 0xA3 : //VC-1 #if defined(MEDIAINFO_VC1_YES) Parser=new File_Vc1; #endif break; case 0xA4 : //Dirac #if defined(MEDIAINFO_DIRAC_YES) Parser=new File_Dirac; #endif break; case 0xA5 : //AC-3 case 0xA6 : //E-AC-3 case 0xD3 : //AC-3 #if defined(MEDIAINFO_AC3_YES) Parser=new File_Ac3; #endif break; case 0xD4 : //DTS #if defined(MEDIAINFO_DTS_YES) Parser=new File_Dts; #endif break; case 0xDD : case 0xDE : //OGG #if defined(MEDIAINFO_OGG_YES) Parser=new File_Ogg; Parser->MustSynchronize=false; ((File_Ogg*)Parser)->SizedBlocks=true; #endif break; default: ; } Open_Buffer_Init(Parser); Element_ThisIsAList(); FILLING_END(); }
//--------------------------------------------------------------------------- void File_Gxf_TimeCode::Read_Buffer_Continue() { int8u Validity[504]; if (!IsAtc) { if (Element_Size!=4096) { Skip_XX(Element_Size, "Data"); return; } //Reading bitmap first (validity of first byte is at the end) Element_Offset=504*8; Element_Begin1("Validity"); BS_Begin_LE(); //is Little Endian for (size_t Pos=0; Pos<504; Pos++) { bool Validity_Bit; Get_TB (Validity_Bit, "Bit"); Validity[Pos]=Validity_Bit?1:0; } BS_End_LE(); Skip_B1( "Pad"); Element_End0(); } //Parsing Element_Offset=0; for (size_t Pos=0; Pos<(IsAtc?(size_t)1:(size_t)504); Pos++) { if (IsAtc || Validity[Pos]) { Element_Begin1("TimeCode"); int8u Frames_Units, Frames_Tens, Seconds_Units, Seconds_Tens, Minutes_Units, Minutes_Tens, Hours_Units, Hours_Tens; bool DropFrame; int8u DBB1=0, DBB2=0; if (IsAtc) { bool Temp; BS_Begin(); Get_S1 (4, Frames_Units, "Frames (Units)"); Get_SB ( Temp, "DBB1_0"); if (Temp) DBB1|=(1<<0); Skip_S1(3, "Zero"); Skip_S1(4, "BG1"); Get_SB ( Temp, "DBB1_1"); if (Temp) DBB1|=(1<<1); Skip_S1(3, "Zero"); Skip_SB( "CF - Color fame"); Get_SB ( DropFrame, "DP - Drop frame"); Get_S1 (2, Frames_Tens, "Frames (Tens)"); Get_SB ( Temp, "DBB1_2"); if (Temp) DBB1|=(1<<2); Skip_S1(3, "Zero"); Skip_S1(4, "BG2"); Get_SB ( Temp, "DBB1_3"); if (Temp) DBB1|=(1<<3); Skip_S1(3, "Zero"); Get_S1 (4, Seconds_Units, "Seconds (Units)"); Get_SB ( Temp, "DBB1_4"); if (Temp) DBB1|=(1<<4); Skip_S1(3, "Zero"); Skip_S1(4, "BG3"); Get_SB ( Temp, "DBB1_5"); if (Temp) DBB1|=(1<<5); Skip_S1(3, "Zero"); Skip_SB( "FM - Frame Mark"); Get_S1 (3, Seconds_Tens, "Seconds (Tens)"); Get_SB ( Temp, "DBB1_6"); if (Temp) DBB1|=(1<<6); Skip_S1(3, "Zero"); Skip_S1(4, "BG4"); Get_SB ( Temp, "DBB1_7"); if (Temp) DBB1|=(1<<7); Skip_S1(3, "Zero"); Get_S1 (4, Minutes_Units, "Minutes (Units)"); Get_SB ( Temp, "DBB2_0"); if (Temp) DBB2|=(1<<0); Skip_S1(3, "Zero"); Skip_S1(4, "BG5"); Get_SB ( Temp, "DBB2_1"); if (Temp) DBB2|=(1<<1); Skip_S1(3, "Zero"); Skip_SB( "BGF0"); Get_S1 (3, Minutes_Tens, "Minutes (Tens)"); Get_SB ( Temp, "DBB2_2"); if (Temp) DBB2|=(1<<2); Skip_S1(3, "Zero"); Skip_S1(4, "BG6"); Get_SB ( Temp, "DBB2_3"); if (Temp) DBB2|=(1<<3); Skip_S1(3, "Zero"); Get_S1 (4, Hours_Units, "Hours (Units)"); Get_SB ( Temp, "DBB2_4"); if (Temp) DBB2|=(1<<4); Skip_S1(3, "Zero"); Skip_S1(4, "BG7"); Get_SB ( Temp, "DBB2_5"); if (Temp) DBB2|=(1<<5); Skip_S1(3, "Zero"); Skip_SB( "BGF2"); Skip_SB( "BGF1"); Get_S1 (2, Hours_Tens, "Hours (Tens)"); Get_SB ( Temp, "DBB2_6"); if (Temp) DBB2|=(1<<6); Skip_S1(3, "Zero"); Skip_S1(4, "BG8"); Get_SB ( Temp, "DBB2_7"); if (Temp) DBB2|=(1<<7); Skip_S1(3, "Zero"); BS_End(); } else { BS_Begin(); Skip_S1(4, "BG1"); Get_S1 (4, Frames_Units, "Frames (Units)"); Skip_S1(4, "BG2"); Skip_SB( "CF - Color fame"); Get_SB ( DropFrame, "DP - Drop frame"); Get_S1 (2, Frames_Tens, "Frames (Tens)"); Skip_S1(4, "BG3"); Get_S1 (4, Seconds_Units, "Seconds (Units)"); Skip_S1(4, "BG4"); Skip_SB( "FM - Frame Mark"); Get_S1 (3, Seconds_Tens, "Seconds (Tens)"); Skip_S1(4, "BG5"); Get_S1 (4, Minutes_Units, "Minutes (Units)"); Skip_S1(4, "BG6"); Skip_SB( "BGF0"); Get_S1 (3, Minutes_Tens, "Minutes (Tens)"); Skip_S1(4, "BG7"); Get_S1 (4, Hours_Units, "Hours (Units)"); Skip_S1(4, "BG8"); Skip_SB( "BGF2"); Skip_SB( "BGF1"); Get_S1 (2, Hours_Tens, "Hours (Tens)"); BS_End(); } int64u TimeCode_Ms=(int64u)(Hours_Tens *10*60*60*1000 + Hours_Units *60*60*1000 + Minutes_Tens *10*60*1000 + Minutes_Units *60*1000 + Seconds_Tens *10*1000 + Seconds_Units *1000 + (Gxf_FrameRate(FrameRate_Code)==0?0:((Frames_Tens*10+Frames_Units)*1000/float64_int32s(Gxf_FrameRate(FrameRate_Code)/(Gxf_FrameRate(FrameRate_Code)>30?2:1))))); if (TimeCode_FirstFrame.empty()) { TimeCode_FirstFrame+=('0'+Hours_Tens); TimeCode_FirstFrame+=('0'+Hours_Units); TimeCode_FirstFrame+=':'; TimeCode_FirstFrame+=('0'+Minutes_Tens); TimeCode_FirstFrame+=('0'+Minutes_Units); TimeCode_FirstFrame+=':'; TimeCode_FirstFrame+=('0'+Seconds_Tens); TimeCode_FirstFrame+=('0'+Seconds_Units); TimeCode_FirstFrame+=DropFrame?';':':'; TimeCode_FirstFrame+=('0'+Frames_Tens); TimeCode_FirstFrame+=('0'+Frames_Units); } #if MEDIAINFO_TRACE string TimeCode; TimeCode+=('0'+Hours_Tens); TimeCode+=('0'+Hours_Units); TimeCode+=':'; TimeCode+=('0'+Minutes_Tens); TimeCode+=('0'+Minutes_Units); TimeCode+=':'; TimeCode+=('0'+Seconds_Tens); TimeCode+=('0'+Seconds_Units); TimeCode+=DropFrame?';':':'; TimeCode+=('0'+Frames_Tens); TimeCode+=('0'+Frames_Units); Element_Info1(TimeCode.c_str()); #endif //MEDIAINFO_TRACE if (IsAtc) { Settings=Atc_PayloadType(DBB1); Element_Info1(__T("PayloadType=")+Ztring().From_UTF8(Settings.c_str())); Element_Info1(__T("VitcLineSelect=")+Ztring::ToZtring(DBB2&0x1F)); } Element_End0(); FILLING_BEGIN(); if (TimeCode_FirstFrame_ms==(int64u)-1) TimeCode_FirstFrame_ms=TimeCode_Ms; FILLING_END(); } else Skip_XX(8, "Junk"); } //bitmap, already parsed Element_Offset+=64; FILLING_BEGIN(); if (!Status[IsFilled] && TimeCode_FirstFrame_ms!=(int64u)-1) { Accept(); Fill(); if (MediaInfoLib::Config.ParseSpeed_Get()<1) Finish(); } FILLING_END(); }
//--------------------------------------------------------------------------- void File_Mpeg4_Descriptors::Descriptor_04() { //Parsing int32u bufferSizeDB, MaxBitrate, AvgBitrate; int8u streamType; Get_B1 (ObjectTypeId, "objectTypeIndication"); Param_Info1(Mpeg4_Descriptors_ObjectTypeIndication(ObjectTypeId)); BS_Begin(); Get_S1 (6, streamType, "streamType"); Param_Info1(Mpeg4_Descriptors_StreamType(streamType)); Skip_SB( "upStream"); Skip_SB( "reserved"); BS_End(); Get_B3 (bufferSizeDB, "bufferSizeDB"); Get_B4 (MaxBitrate, "maxBitrate"); Get_B4 (AvgBitrate, "avgBitrate"); FILLING_BEGIN(); if (KindOfStream==Stream_Max) switch (ObjectTypeId) { case 0x20 : case 0x21 : case 0x60 : case 0x61 : case 0x62 : case 0x63 : case 0x64 : case 0x65 : case 0x6A : case 0x6C : case 0x6D : case 0x6E : case 0xA3 : case 0xA4 : KindOfStream=Stream_Video; break; case 0x40 : case 0x66 : case 0x67 : case 0x68 : case 0x69 : case 0x6B : case 0xA0 : case 0xA1 : case 0xA5 : case 0xA6 : case 0xA9 : case 0xAA : case 0xAB : case 0xAC : case 0xD1 : case 0xD3 : case 0xD4 : case 0xE1 : KindOfStream=Stream_Audio; break; case 0x08 : KindOfStream=Stream_Text; break; default: ; } if (Count_Get(KindOfStream)==0) Stream_Prepare(KindOfStream); switch (ObjectTypeId) { case 0x01 : Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Format), "System", Error, false, true); break; case 0x02 : Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Format), "System Core", Error, false, true); break; //case 0x03 Interaction Stream //case 0x05 AFX //case 0x06 Font Data //case 0x07 Synthesized Texture Stream case 0x08 : Fill(Stream_Text , StreamPos_Last, Text_Format, "Streaming Text", Error, false, true); break; case 0x20 : Fill(Stream_Video , StreamPos_Last, Video_Format, "MPEG-4 Visual", Error, false, true); break; case 0x21 : Fill(Stream_Video , StreamPos_Last, Video_Format, "AVC", Error, false, true); break; //case 0x22 Parameter Sets for AVC case 0x40 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "AAC", Error, false, true); break; //MPEG-4 AAC case 0x60 : Fill(Stream_Video , StreamPos_Last, Video_Format, "MPEG Video", Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Profile, "Simple" , Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Version, "Version 2", Error, false, true); break; //MPEG-2V Simple case 0x61 : Fill(Stream_Video , StreamPos_Last, Video_Format, "MPEG Video", Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Profile, "Main" , Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Version, "Version 2", Error, false, true); break; //MPEG-2V Main case 0x62 : Fill(Stream_Video , StreamPos_Last, Video_Format, "MPEG Video", Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Profile, "SNR" , Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Version, "Version 2", Error, false, true); break; //MPEG-2V SNR case 0x63 : Fill(Stream_Video , StreamPos_Last, Video_Format, "MPEG Video", Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Profile, "Spatial", Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Version, "Version 2", Error, false, true); break; //MPEG-2V Spatial case 0x64 : Fill(Stream_Video , StreamPos_Last, Video_Format, "MPEG Video", Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Profile, "High" , Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Version, "Version 2", Error, false, true); break; //MPEG-2V High case 0x65 : Fill(Stream_Video , StreamPos_Last, Video_Format, "MPEG Video", Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Profile, "4:2:2" , Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Version, "Version 2", Error, false, true); break; //MPEG-2V 4:2:2 case 0x66 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "AAC", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_Format_Profile, "Main", Error, false, true); break; //MPEG-2 AAC Main case 0x67 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "AAC", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_Format_Profile, "LC", Error, false, true); break; //MPEG-2 AAC LC case 0x68 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "AAC", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_Format_Profile, "SSR", Error, false, true); break; //MPEG-2 AAC SSR case 0x69 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "MPEG Audio", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_Format_Version, "Version 2", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_Format_Profile, "Layer 3", Error, false, true); break; case 0x6A : Fill(Stream_Video , StreamPos_Last, Video_Format, "MPEG Video", Error, false, true); Fill(Stream_Video, StreamPos_Last, Video_Format_Version, "Version 1", Error, false, true); break; case 0x6B : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "MPEG Audio", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_Format_Version, "Version 1", Error, false, true); break; case 0x6C : Fill(Stream_Video , StreamPos_Last, Video_Format, "JPEG", Error, false, true); break; case 0x6D : Fill(Stream_Video , StreamPos_Last, Video_Format, "PNG", Error, false, true); break; case 0x6E : Fill(Stream_Video , StreamPos_Last, Video_Format, "MPEG Video", Error, false, true); break; case 0xA0 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "EVRC", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_SamplingRate, 8000, 10, true); Fill(Stream_Audio, StreamPos_Last, Audio_Channel_s_, 1, 10, true); break; case 0xA1 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "SMV", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_SamplingRate, 8000, 10, true); Fill(Stream_Audio, StreamPos_Last, Audio_Channel_s_, 1, 10, true); break; case 0xA2 : Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Format), "3GPP2", Error, false, true); break; case 0xA3 : Fill(Stream_Video , StreamPos_Last, Video_Format, "VC-1", Error, false, true); break; case 0xA4 : Fill(Stream_Video , StreamPos_Last, Video_Format, "Dirac", Error, false, true); break; case 0xA5 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "AC-3", Error, false, true); break; case 0xA6 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "E-AC-3", Error, false, true); break; case 0xA9 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "DTS", Error, false, true); break; case 0xAA : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "DTS", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_Format_Profile, "HRA", Error, false, true); break; // DTS-HD High Resolution case 0xAB : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "DTS", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_Format_Profile, "MA", Error, false, true); break; // DTS-HD Master Audio case 0xAC : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "DTS", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_Format_Profile, "Express", Error, false, true); break; // DTS Express a.k.a. LBR case 0xD1 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "EVRC", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_SamplingRate, 8000, 10, true); Fill(Stream_Audio, StreamPos_Last, Audio_Channel_s_, 1, 10, true); break; case 0xD3 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "AC-3", Error, false, true); break; case 0xD4 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "DTS", Error, false, true); break; case 0xDD : Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Format), "Ogg", Error, false, true); break; case 0xDE : Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Format), "Ogg", Error, false, true); break; case 0xE1 : Fill(Stream_Audio , StreamPos_Last, Audio_Format, "QCELP", Error, false, true); Fill(Stream_Audio, StreamPos_Last, Audio_SamplingRate, 8000, 10, true); Fill(Stream_Audio, StreamPos_Last, Audio_Channel_s_, 1, 10, true); break; default: ; } switch (ObjectTypeId) { case 0x01 : Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Codec), "System", Error, false, true); break; case 0x02 : Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Codec), "System Core", Error, false, true); break; case 0x20 : Fill(Stream_Video , StreamPos_Last, Video_Codec, "MPEG-4V", Error, false, true); break; case 0x21 : Fill(Stream_Video , StreamPos_Last, Video_Codec, "H264", Error, false, true); break; case 0x40 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "AAC", Error, false, true); break; //MPEG-4 AAC case 0x60 : Fill(Stream_Video , StreamPos_Last, Video_Codec, "MPEG-2V", Error, false, true); break; //MPEG-2V Simple case 0x61 : Fill(Stream_Video , StreamPos_Last, Video_Codec, "MPEG-2V", Error, false, true); break; //MPEG-2V Main case 0x62 : Fill(Stream_Video , StreamPos_Last, Video_Codec, "MPEG-2V", Error, false, true); break; //MPEG-2V SNR case 0x63 : Fill(Stream_Video , StreamPos_Last, Video_Codec, "MPEG-2V", Error, false, true); break; //MPEG-2V Spatial case 0x64 : Fill(Stream_Video , StreamPos_Last, Video_Codec, "MPEG-2V", Error, false, true); break; //MPEG-2V High case 0x65 : Fill(Stream_Video , StreamPos_Last, Video_Codec, "MPEG-2V", Error, false, true); break; //MPEG-2V 4:2:2 case 0x66 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "AAC", Error, false, true); break; //MPEG-2 AAC Main case 0x67 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "AAC", Error, false, true); break; //MPEG-2 AAC LC case 0x68 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "AAC", Error, false, true); break; //MPEG-2 AAC SSR case 0x69 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "MPEG-2A L3", Error, false, true); break; case 0x6A : Fill(Stream_Video , StreamPos_Last, Video_Codec, "MPEG-1V", Error, false, true); break; case 0x6B : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "MPEG-1A", Error, false, true); break; case 0x6C : Fill(Stream_Video , StreamPos_Last, Video_Codec, "JPEG", Error, false, true); break; case 0x6D : Fill(Stream_Video , StreamPos_Last, Video_Codec, "PNG", Error, false, true); break; case 0x6E : Fill(Stream_Video , StreamPos_Last, Video_Codec, "MPEG-4V", Error, false, true); break; case 0xA0 : Fill(Stream_Video , StreamPos_Last, Video_Codec, "EVRC", Error, false, true); break; case 0xA1 : Fill(Stream_Video , StreamPos_Last, Video_Codec, "SMV", Error, false, true); break; case 0xA2 : Fill(Stream_Video , StreamPos_Last, Video_Codec, "MPEG-4V", Error, false, true); break; case 0xA3 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "VC-1", Error, false, true); break; case 0xA4 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "Dirac", Error, false, true); break; case 0xA5 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "AC3", Error, false, true); break; case 0xA6 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "AC3+", Error, false, true); break; case 0xA9 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "DTS", Error, false, true); break; case 0xAA : case 0xAB : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "DTS-HD", Error, false, true); break; case 0xAC : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "DTS Express", Error, false, true); break; case 0xD1 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "EVRC", Error, false, true); break; case 0xD3 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "AC3", Error, false, true); break; case 0xD4 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "DTS", Error, false, true); break; case 0xDD : Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Codec), "Ogg", Error, false, true); break; case 0xDE : Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Codec), "Ogg", Error, false, true); break; case 0xE1 : Fill(Stream_Audio , StreamPos_Last, Audio_Codec, "QCELP", Error, false, true); break; default: ; } Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_CodecID), ObjectTypeId, 16, true); Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Codec_CC), ObjectTypeId, 16, true); //Bitrate mode if (AvgBitrate>0 && !(bufferSizeDB==AvgBitrate && bufferSizeDB==MaxBitrate && bufferSizeDB==0x1000)) //Some buggy data were found { Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_BitRate_Nominal), AvgBitrate); if (MaxBitrate<=AvgBitrate*1.005) Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_BitRate_Mode), "CBR"); else { Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_BitRate_Mode), "VBR"); Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_BitRate_Maximum), MaxBitrate); } } //Creating parser delete Parser; Parser=NULL; switch (ObjectTypeId) { case 0x01 : switch (streamType) { case 0x01 : Parser=new File_Mpeg4_Descriptors; break; default : ; } break; case 0x20 : //MPEG-4 Visual #if defined(MEDIAINFO_MPEG4V_YES) Parser=new File_Mpeg4v; ((File_Mpeg4v*)Parser)->Frame_Count_Valid=1; ((File_Mpeg4v*)Parser)->FrameIsAlwaysComplete=true; #endif break; case 0x21 : //AVC #if defined(MEDIAINFO_AVC_YES) Parser=new File_Avc; ((File_Avc*)Parser)->MustParse_SPS_PPS=true; ((File_Avc*)Parser)->MustSynchronize=false; ((File_Avc*)Parser)->SizedBlocks=true; #endif break; case 0x40 : //MPEG-4 AAC case 0x66 : case 0x67 : case 0x68 : //MPEG-2 AAC #if defined(MEDIAINFO_AAC_YES) Parser=new File_Aac; ((File_Aac*)Parser)->Mode=File_Aac::Mode_AudioSpecificConfig; ((File_Aac*)Parser)->FrameIsAlwaysComplete=true; #endif break; case 0x60 : case 0x61 : case 0x62 : case 0x63 : case 0x64 : case 0x65 : case 0x6A : //MPEG Video #if defined(MEDIAINFO_MPEGV_YES) Parser=new File_Mpegv; ((File_Mpegv*)Parser)->FrameIsAlwaysComplete=true; #endif break; case 0x69 : case 0x6B : //MPEG Audio #if defined(MEDIAINFO_MPEGA_YES) Parser=new File_Mpega; #endif break; case 0x6C : //JPEG #if defined(MEDIAINFO_JPEG_YES) Parser=new File_Jpeg; ((File_Jpeg*)Parser)->StreamKind=Stream_Video; #endif break; case 0x6D : //PNG #if defined(MEDIAINFO_PNG_YES) Parser=new File_Png; #endif break; case 0xA3 : //VC-1 #if defined(MEDIAINFO_VC1_YES) Parser=new File_Vc1; #endif break; case 0xA4 : //Dirac #if defined(MEDIAINFO_DIRAC_YES) Parser=new File_Dirac; #endif break; case 0xA5 : //AC-3 case 0xA6 : //E-AC-3 case 0xD3 : //AC-3 #if defined(MEDIAINFO_AC3_YES) Parser=new File_Ac3; #endif break; case 0xA9 : //DTS case 0xAA : //DTS HRA case 0xAB : //DTS MA case 0xAC : //DTS Express case 0xD4 : //DTS #if defined(MEDIAINFO_DTS_YES) Parser=new File_Dts; #endif break; case 0xDD : case 0xDE : //OGG #if defined(MEDIAINFO_OGG_YES) Parser=new File_Ogg; Parser->MustSynchronize=false; ((File_Ogg*)Parser)->SizedBlocks=true; #endif break; default: ; } Element_Code=(int64u)-1; Open_Buffer_Init(Parser); Element_ThisIsAList(); FILLING_END(); }
//--------------------------------------------------------------------------- // GASpecificConfig void File_Mpeg4_AudioSpecificConfig::GASpecificConfig () { Element_Begin("GASpecificConfig"); bool dependsOnCoreCoder, extensionFlag; Info_SB( frameLengthFlag, "frameLengthFlag"); Param_Info(frameLengthFlag==0?1024:960, " bytes"); Get_SB ( dependsOnCoreCoder, "dependsOnCoreCoder"); if (dependsOnCoreCoder) Skip_S2(14, "coreCoderDelay"); Get_SB ( extensionFlag, "extensionFlag"); if (channelConfiguration==0) { Element_Begin("Extension"); int8u Channels=0, Channels_Front=0, Channels_Side=0, Channels_Back=0, Channels_LFE=0; int8u num_front_channel_elements, num_side_channel_elements, num_back_channel_elements, num_lfe_channel_elements, num_assoc_data_elements, num_valid_cc_elements, comment_field_bytes; Skip_S1(4, "element_instance_tag"); Skip_S1(2, "object_type"); Skip_S1(4, "sampling_frequency_index"); //Not used, is often 0 Get_S1 (4, num_front_channel_elements, "num_front_channel_elements"); Get_S1 (4, num_side_channel_elements, "num_side_channel_elements"); Get_S1 (4, num_back_channel_elements, "num_back_channel_elements"); Get_S1 (2, num_lfe_channel_elements, "num_lfe_channel_elements"); Get_S1 (3, num_assoc_data_elements, "num_assoc_data_elements"); Get_S1 (4, num_valid_cc_elements, "num_valid_cc_elements"); TEST_SB_SKIP( "mono_mixdown_present"); Skip_S1(4, "mono_mixdown_element_number"); TEST_SB_END(); TEST_SB_SKIP( "stereo_mixdown_present"); Skip_S1(4, "stereo_mixdown_element_number"); TEST_SB_END(); TEST_SB_SKIP( "matrix_mixdown_idx_present"); Skip_S1(2, "matrix_mixdown_idx"); Skip_SB( "pseudo_surround_enable"); TEST_SB_END(); for (int8u Pos=0; Pos<num_front_channel_elements; Pos++) { Element_Begin("Front channel"); bool front_element_is_cpe; Get_SB ( front_element_is_cpe, "front_element_is_cpe"); Skip_S1(4, "front_element_tag_select"); if (front_element_is_cpe) { Channels_Front+=2; Channels+=2; } else { Channels_Front++; Channels++; } Element_End(); } for (int8u Pos=0; Pos<num_side_channel_elements; Pos++) { Element_Begin("Side channel"); bool side_element_is_cpe; Get_SB ( side_element_is_cpe, "side_element_is_cpe"); Skip_S1(4, "side_element_tag_select"); if (side_element_is_cpe) { Channels_Side+=2; Channels+=2; } else { Channels_Side++; Channels++; } Element_End(); } for (int8u Pos=0; Pos<num_back_channel_elements; Pos++) { Element_Begin("Back channel"); bool back_element_is_cpe; Get_SB ( back_element_is_cpe, "back_element_is_cpe"); Skip_S1(4, "back_element_tag_select"); if (back_element_is_cpe) { Channels_Back+=2; Channels+=2; } else { Channels_Back++; Channels++; } Element_End(); } for (int8u Pos=0; Pos<num_lfe_channel_elements; Pos++) { Element_Begin("LFE"); Skip_S1(4, "lfe_element_tag_select"); Channels_LFE++; Channels++; Element_End(); } for (int8u Pos=0; Pos<num_assoc_data_elements; Pos++) { Element_Begin("assoc_data_element"); Skip_S1(4, "assoc_data_element_tag_select"); Element_End(); } for (int8u Pos=0; Pos<num_valid_cc_elements; Pos++) { Element_Begin("valid_cc_element"); Skip_SB( "cc_element_is_ind_sw"); Skip_S1(4, "valid_cc_element_tag_select"); Element_End(); } BS_End(); //Byte align Get_B1 (comment_field_bytes, "comment_field_bytes"); if (comment_field_bytes) Skip_XX(comment_field_bytes, "comment_field_data"); BS_Begin(); //The stream needs continuity in the bitstream Element_End(); //Filling Ztring Channels_Positions, Channels_Positions2; switch (Channels_Front) { case 0 : break; case 1 : Channels_Positions+=_T("Front: C"); break; case 2 : Channels_Positions+=_T("Front: L R"); break; case 3 : Channels_Positions+=_T("Front: L C R"); break; default : Channels_Positions+=_T("Front: "); Channels_Positions+=Ztring::ToZtring(Channels_Front); //Which config? } switch (Channels_Side) { case 0 : break; case 1 : Channels_Positions+=_T(", Side: C"); break; case 2 : Channels_Positions+=_T(", Side: L R"); break; case 3 : Channels_Positions+=_T(", Side: L C R"); break; default : Channels_Positions+=_T(", Side: "); Channels_Positions+=Ztring::ToZtring(Channels_Side); //Which config? } switch (Channels_Back) { case 0 : break; case 1 : Channels_Positions+=_T(", Rear: C"); break; case 2 : Channels_Positions+=_T(", Rear: L R"); break; case 3 : Channels_Positions+=_T(", Rear: L C R"); break; default : Channels_Positions+=_T(", Rear: "); Channels_Positions+=Ztring::ToZtring(Channels_Back); //Which config? } switch (Channels_LFE) { case 0 : break; case 1 : Channels_Positions+=_T(", LFE"); break; default : Channels_Positions+=_T(", LFE= "); Channels_Positions+=Ztring::ToZtring(Channels_LFE); //Which config? } Channels_Positions2=Ztring::ToZtring(Channels_Front)+_T('/')+ Ztring::ToZtring(Channels_Side)+ (Channels_Back?(_T('/')+Ztring::ToZtring(Channels_Back)):Ztring())+ (Channels_LFE? (_T('.')+Ztring::ToZtring(Channels_LFE )):Ztring()); //Filling Accept("AudioSpecificConfig"); Stream_Prepare(Stream_Audio); Fill(Stream_Audio, StreamPos_Last, Audio_Channel_s_, Channels_Front+Channels_Side+Channels_Back+Channels_LFE); Fill(Stream_Audio, StreamPos_Last, Audio_ChannelPositions, Channels_Positions); Fill(Stream_Audio, StreamPos_Last, Audio_ChannelPositions_String2, Channels_Positions2); } if (audioObjectType==06 || audioObjectType==20) Skip_S1(3, "layerNr"); if (extensionFlag) { bool extensionFlag3; if (audioObjectType==22) { Skip_S1( 5, "numOfSubFrame"); Skip_S2(11, "layer_length"); } if (audioObjectType==17 || audioObjectType==19 || audioObjectType==20 || audioObjectType==23) { Skip_SB( "aacSectionDataResilienceFlag"); Skip_SB( "aacScalefactorDataResilienceFlag"); Skip_SB( "aacSpectralDataResilienceFlag"); } Get_SB ( extensionFlag3, "extensionFlag3"); if (extensionFlag3) { //TODO... } } Element_End(); }
//--------------------------------------------------------------------------- void File_Aac::ALSSpecificConfig() { //Not in spec, but something weird in the example I have int32u Junk; while (Data_BS_Remain()) { Peek_S4(32, Junk); if (Junk!=0x414C5300) { Skip_SB( "Unknown"); } else break; } if (Data_BS_Remain()==0) return; //There is a problem Element_Begin1("ALSSpecificConfig"); bool chan_config,chan_sort,crc_enabled,aux_data_enabled; int32u samp_freq, samples; int16u channels,frame_length; int8u ra_flag,random_access, file_type; Skip_BS(32,"als_id"); Get_BS (32, samp_freq, "samp_freq"); Get_BS (32, samples, "samples"); Get_S2 (16, channels, "channels"); Param_Info2(channels+1, " channel(s)"); Get_S1 (3, file_type, "file_type"); Skip_S1(3,"resolution"); Skip_SB("floating"); Skip_SB("msb_first"); Get_S2 (16,frame_length,"frame_length"); Get_S1 (8,random_access,"random_access"); Get_S1 (2,ra_flag,"ra_flag"); Skip_SB("adapt_order"); Skip_S1(2,"coef_table"); Skip_SB("long_term_prediction"); Skip_S2(10,"max_order"); Skip_S1(2,"block_switching"); Skip_SB("bgmc_mode"); Skip_SB("sb_part"); Skip_SB("joint_stereo"); Skip_SB("mc_coding"); Get_SB (chan_config,"chan_config"); Get_SB (chan_sort,"chan_sort"); Get_SB (crc_enabled,"crc_enabled"); Skip_SB("RLSLMS"); Skip_BS(5,"(reserved)"); Get_SB (aux_data_enabled,"aux_data_enabled"); if (chan_config) Skip_S2(16,"chan_config_info"); if (chan_sort) { int16u ChBits=(int16u)ceil(log((double)(channels+1))/log((double)2)); for (int8u c=0; c<=channels; c++) Skip_BS(ChBits, "chan_pos[c]"); } if(Data_BS_Remain()%8) Skip_S1(Data_BS_Remain()%8, "byte_align"); BS_End(); int32u header_size,trailer_size; Get_B4(header_size, "header_size"); Get_B4(trailer_size, "trailer_size"); #ifdef MEDIAINFO_RIFF_YES if (file_type==1) //WAVE file { Element_Begin1("orig_header"); File_Riff MI; Open_Buffer_Init(&MI); Open_Buffer_Continue(&MI, Buffer+Buffer_Offset+(size_t)Element_Offset, header_size); Element_Offset+=header_size; File__Analyze::Finish(&MI); //No merge of data, only for trace information, because this is the data about the decoded stream, not the encoded stream Element_End0(); } else #endif //MEDIAINFO_RIFF_YES Skip_XX(header_size, "orig_header[]"); Skip_XX(trailer_size, "orig_trailer[]"); if (crc_enabled) Skip_B4( "crc"); if ((ra_flag == 2) && (random_access > 0)) for (int32u f=0; f<((samples-1)/(frame_length+1))+1; f++) Skip_B4( "ra_unit_size[f]"); if (aux_data_enabled) { int32u aux_size; Get_B4(aux_size, "aux_size"); Skip_XX(aux_size, "aux_data[]"); } Element_End0(); BS_Begin(); //To be in sync with other objectTypes FILLING_BEGIN(); //Filling File__Analyze::Stream_Prepare(Stream_Audio); Fill(Stream_Audio, StreamPos_Last, Audio_Channel_s_, channels+1); //Forcing default confignuration (something weird in the example I have) channelConfiguration=0; sampling_frequency_index=(int8u)-1; sampling_frequency=samp_freq; FILLING_END(); }
//--------------------------------------------------------------------------- void File_Aac::MPEG_1_2_SpecificConfig() { Element_Begin1("MPEG_1_2_SpecificConfig"); Skip_SB( "extension"); Element_End0(); }