//--------------------------------------------------------------------------- void File_Mpeg4_TimeCode::FileHeader_Parse() { //Parsing int32u Position=0; while (Element_Offset<Element_Size) Get_B4 (Position, "Position"); FILLING_BEGIN(); Accept("TimeCode"); if (FrameRate) { int64s Pos=Position; if (NegativeTimes) Pos=(int32s)Position; if (StreamKind==Stream_General) { //No link with a track, we do all Stream_Prepare(Stream_Video); Fill(Stream_Video, 0, Video_Delay, Pos*1000/FrameRate, 0); Fill(Stream_Video, 0, Video_Delay_Source, "Container"); Stream_Prepare(Stream_Audio); Fill(Stream_Audio, 0, Audio_Delay, Pos*1000/FrameRate, 0); Fill(Stream_Video, 0, Video_Delay_Source, "Container"); } else { Stream_Prepare(StreamKind); Fill(StreamKind, 0, Fill_Parameter(StreamKind_Last, Generic_Delay), Pos*1000/FrameRate, 0); Fill(StreamKind, 0, Fill_Parameter(StreamKind_Last, Generic_Delay_Source), "Container"); } } Finish("TimeCode"); FILLING_END(); }
//--------------------------------------------------------------------------- void File_TimedText::Data_Parse() { //Parsing Ztring Value; Get_UTF8 (Element_Size, Value, "Value"); FILLING_BEGIN(); if (!Status[IsAccepted]) { Accept(); #ifdef MEDIAINFO_MPEG4_YES if (IsChapter) { Stream_Prepare(Stream_Menu); } else #endif //MEDIAINFO_MPEG4_YES { Stream_Prepare(Stream_Text); } Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_Format), "Timed Text"); #ifdef MEDIAINFO_MPEG4_YES if (IsChapter) Fill(StreamKind_Last, StreamPos_Last, Menu_Chapters_Pos_Begin, Count_Get(StreamKind_Last, StreamPos_Last), 10, true); #endif //MEDIAINFO_MPEG4_YES } #ifdef MEDIAINFO_MPEG4_YES if (IsChapter) { } else #endif //MEDIAINFO_MPEG4_YES { Finish(); } #ifdef MEDIAINFO_MPEG4_YES if (IsChapter && FrameInfo.DTS!=(int64u)-1 && Buffer_Offset==2) { Fill(Stream_Menu, StreamPos_Last, Ztring().Duration_From_Milliseconds(FrameInfo.DTS/1000000).To_UTF8().c_str(), Value); Fill(Stream_Menu, StreamPos_Last, Menu_Chapters_Pos_End, Count_Get(Stream_Menu, StreamPos_Last), 10, true); } #endif //MEDIAINFO_MPEG4_YES FILLING_END(); Element_Offset=Buffer_Size-Buffer_Offset; //Buffer can also contain atoms after the text, ignoring them }
//--------------------------------------------------------------------------- void File_Png::Streams_Accept() { if (!IsSub) { TestContinuousFileNames(); Stream_Prepare((Config->File_Names.size()>1 || Config->File_IsReferenced_Get())?Stream_Video:Stream_Image); if (File_Size!=(int64u)-1) Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_StreamSize), File_Size); if (StreamKind_Last==Stream_Video) Fill(Stream_Video, StreamPos_Last, Video_FrameCount, Config->File_Names.size()); } else Stream_Prepare(StreamKind_Last); }
//--------------------------------------------------------------------------- void File_Dpx::Streams_Accept() { if (!IsSub) { TestContinuousFileNames(); Stream_Prepare((Config->File_Names.size()>1 || Config->File_IsReferenced_Get())?Stream_Video:Stream_Image); if (File_Size!=(int64u)-1) Fill(StreamKind_Last, StreamPos_Last, Fill_Parameter(StreamKind_Last, Generic_StreamSize), File_Size); if (StreamKind_Last==Stream_Video) Fill(Stream_Video, StreamPos_Last, Video_FrameCount, Config->File_Names.size()); } else Stream_Prepare(Stream_Image); //Configuration Buffer_MaximumSize=64*1024*1024; //Some big frames are possible (e.g YUV 4:2:2 10 bits 1080p) }
//--------------------------------------------------------------------------- bool File_Png::FileHeader_Begin() { //Element_Size if (Buffer_Size<8) return false; //Must wait for more data if (CC4(Buffer+4)!=0x0D0A1A0A) //Byte order { Reject("PNG"); return false; } switch (CC4(Buffer)) //Signature { case 0x89504E47 : Accept("PNG"); Fill(Stream_General, 0, General_Format, "PNG"); Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_Format), "PNG"); Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_Codec), "PNG"); break; case 0x8A4E4E47 : Accept("PNG"); Fill(Stream_General, 0, General_Format, "MNG"); Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_Format), "MNG"); Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_Codec), "MNG"); Finish("PNG"); break; case 0x8B4A4E47 : Accept("PNG"); Fill(Stream_General, 0, General_Format, "JNG"); Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_Format), "JNG"); Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_Codec), "JNG"); Finish("PNG"); break; default: Reject("PNG"); } //All should be OK... return true; }
//--------------------------------------------------------------------------- void File_Jpeg::SOF_() { //Parsing vector<Jpeg_samplingfactor> SamplingFactors; int16u Height, Width; int8u Resolution, Count; Get_B1 (Resolution, "P - Sample precision"); Get_B2 (Height, "Y - Number of lines"); Get_B2 (Width, "X - Number of samples per line"); Get_B1 (Count, "Nf - Number of image components in frame"); for (int8u Pos=0; Pos<Count; Pos++) { Jpeg_samplingfactor SamplingFactor; Element_Begin1("Component"); Info_B1(Ci, "Ci - Component identifier"); Element_Info1(Ci); BS_Begin(); Get_S1 (4, SamplingFactor.Hi, "Hi - Horizontal sampling factor"); Element_Info1(SamplingFactor.Hi); Get_S1 (4, SamplingFactor.Vi, "Vi - Vertical sampling factor"); Element_Info1(SamplingFactor.Vi); BS_End(); Skip_B1( "Tqi - Quantization table destination selector"); Element_End0(); //Filling list of HiVi SamplingFactors.push_back(SamplingFactor); } FILLING_BEGIN_PRECISE(); if (Frame_Count==0 && Field_Count==0) { Accept("JPEG"); if (Count_Get(StreamKind_Last)==0) Stream_Prepare(StreamKind_Last); Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_Format), "JPEG"); Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_Codec), "JPEG"); if (StreamKind_Last==Stream_Image) Fill(Stream_Image, 0, Image_Codec_String, "JPEG", Unlimited, true, true); //To Avoid automatic filling if (StreamKind_Last==Stream_Video) Fill(Stream_Video, 0, Video_InternetMediaType, "video/JPEG", Unlimited, true, true); Fill(StreamKind_Last, 0, "ColorSpace", "YUV"); Fill(StreamKind_Last, 0, Fill_Parameter(StreamKind_Last, Generic_BitDepth), Resolution); Fill(StreamKind_Last, 0, "Height", Height*(Interlaced?2:1)); Fill(StreamKind_Last, 0, "Width", Width); //Chroma subsampling if (SamplingFactors.size()==3 && SamplingFactors[1].Hi==1 && SamplingFactors[2].Hi==1 && SamplingFactors[1].Vi==1 && SamplingFactors[2].Vi==1) { string ChromaSubsampling; switch (SamplingFactors[0].Hi) { case 1 : switch (SamplingFactors[0].Vi) { case 1 : ChromaSubsampling="4:4:4"; break; default: ; } break; case 2 : switch (SamplingFactors[0].Vi) { case 1 : ChromaSubsampling="4:2:2"; break; case 2 : ChromaSubsampling="4:2:0"; break; default: ; } break; case 4 : switch (SamplingFactors[0].Vi) { case 1 : ChromaSubsampling="4:1:1"; break; default: ; } break; default: ; } if (!ChromaSubsampling.empty()) Fill(StreamKind_Last, 0, "ChromaSubsampling", ChromaSubsampling); } } FILLING_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_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(); }
//--------------------------------------------------------------------------- void File_Wm::Streams_Finish() { //Encryption management /*const Ztring& Encryption=Retrieve(Stream_General, 0, General_Encryption); if (!Encryption.empty()) { for (size_t StreamKind=Stream_General+1; StreamKind<Stream_Max; StreamKind++) for (size_t Pos=0; Pos<(*Stream[StreamKind]).size(); Pos++) Fill ((stream_t)StreamKind, 0, "Encryption", Encryption); } Fill("BitRate", CurrentBitRate[StreamNumber]); */ std::map<int16u, stream>::iterator Temp=Stream.begin(); while (Temp!=Stream.end()) { for (std::map<std::string, ZenLib::Ztring>::iterator Info_Temp=Temp->second.Info.begin(); Info_Temp!=Temp->second.Info.end(); Info_Temp++) Fill(Temp->second.StreamKind, Temp->second.StreamPos, Info_Temp->first.c_str(), Info_Temp->second, true); //Codec Info for (size_t Pos=0; Pos<CodecInfos.size(); Pos++) { if ((CodecInfos[Pos].Type==1 && Temp->second.StreamKind==Stream_Video) || (CodecInfos[Pos].Type==2 && Temp->second.StreamKind==Stream_Audio)) { Fill(Temp->second.StreamKind, Temp->second.StreamPos, "CodecID_Description", CodecInfos[Pos].Info, true); Fill(Temp->second.StreamKind, Temp->second.StreamPos, "Codec_Description", CodecInfos[Pos].Info, true); } } if (Temp->second.StreamKind==Stream_Video) { //Some tests about the frame rate std::map<int32u, int32u> PresentationTime_Deltas_Problem; std::map<int32u, int32u> PresentationTime_Deltas_Most; for (std::map<ZenLib::int32u, ZenLib::int32u>::iterator PresentationTime_Delta=Temp->second.PresentationTime_Deltas.begin(); PresentationTime_Delta!=Temp->second.PresentationTime_Deltas.end(); PresentationTime_Delta++) { if (PresentationTime_Delta->second>=5) PresentationTime_Deltas_Problem[PresentationTime_Delta->first]=PresentationTime_Delta->second; if (PresentationTime_Delta->second>=30) PresentationTime_Deltas_Most[PresentationTime_Delta->first]=PresentationTime_Delta->second; } if (PresentationTime_Deltas_Most.size()==0 || (PresentationTime_Deltas_Most.size()==1 && PresentationTime_Deltas_Problem.size()>1) || (PresentationTime_Deltas_Most.size()==2 && PresentationTime_Deltas_Problem.size()>2)) { if (Temp->second.AverageTimePerFrame>0) Fill(Stream_Video, Temp->second.StreamPos, Video_FrameRate, ((float)10000000)/Temp->second.AverageTimePerFrame, 3, true); } else if (PresentationTime_Deltas_Most.size()==1) { if (PresentationTime_Deltas_Most.begin()->first>1) //Not 0, we want to remove Delta incremented 1 per 1 Fill(Stream_Video, Temp->second.StreamPos, Video_FrameRate, 1000/((float64)PresentationTime_Deltas_Most.begin()->first), 3, true); if (Temp->second.AverageTimePerFrame>0) Fill(Stream_Video, Temp->second.StreamPos, Video_FrameRate_Nominal, ((float)10000000)/Temp->second.AverageTimePerFrame, 3, true); } else if (PresentationTime_Deltas_Most.size()==2) { std::map<int32u, int32u>::iterator PresentationTime_Delta_Most=PresentationTime_Deltas_Most.begin(); float64 PresentationTime_Deltas_1_Value=(float64)PresentationTime_Delta_Most->first; float64 PresentationTime_Deltas_1_Count=(float64)PresentationTime_Delta_Most->second; PresentationTime_Delta_Most++; float64 PresentationTime_Deltas_2_Value=(float64)PresentationTime_Delta_Most->first; float64 PresentationTime_Deltas_2_Count=(float64)PresentationTime_Delta_Most->second; float64 FrameRate_Real=1000/(((PresentationTime_Deltas_1_Value*PresentationTime_Deltas_1_Count)+(PresentationTime_Deltas_2_Value*PresentationTime_Deltas_2_Count))/(PresentationTime_Deltas_1_Count+PresentationTime_Deltas_2_Count)); Fill(Temp->second.StreamKind, Temp->second.StreamPos, Video_FrameRate, FrameRate_Real, 3, true); if (Temp->second.AverageTimePerFrame>0) Fill(Stream_Video, Temp->second.StreamPos, Video_FrameRate_Nominal, ((float)10000000)/Temp->second.AverageTimePerFrame, 3, true); } else { Fill(Stream_Video, Temp->second.StreamPos, Video_FrameRate_Mode, "VFR"); if (Temp->second.AverageTimePerFrame>0) Fill(Stream_Video, Temp->second.StreamPos, Video_FrameRate_Nominal, ((float)10000000)/Temp->second.AverageTimePerFrame, 3, true); } } if (Temp->second.AverageBitRate>0) Fill(Temp->second.StreamKind, Temp->second.StreamPos, "BitRate", Temp->second.AverageBitRate, 10, true); if (Temp->second.LanguageID!=(int16u)-1 && Temp->second.LanguageID<(int16u)Languages.size()) Fill(Temp->second.StreamKind, Temp->second.StreamPos, "Language", Languages[Temp->second.LanguageID]); else if (!Language_ForAll.empty()) Fill(Temp->second.StreamKind, Temp->second.StreamPos, "Language", Language_ForAll); if (Temp->second.Parser) { if (Temp->second.StreamKind==Stream_Max) if (Temp->second.Parser->Count_Get(Stream_Audio)) { Stream_Prepare(Stream_Audio); Temp->second.StreamKind=StreamKind_Last; Temp->second.StreamPos=StreamPos_Last; } Ztring Format_Profile; if (Temp->second.StreamKind==Stream_Video) Format_Profile=Retrieve(Stream_Video, Temp->second.StreamPos, Video_Format_Profile); Finish(Temp->second.Parser); if (Temp->second.Parser->Get(Stream_Video, 0, Video_Format)==_T("MPEG Video")) { //Width/Height are junk Clear(Stream_Video, Temp->second.StreamPos, Video_Width); Clear(Stream_Video, Temp->second.StreamPos, Video_Height); Clear(Stream_Video, Temp->second.StreamPos, Video_PixelAspectRatio); Clear(Stream_Video, Temp->second.StreamPos, Video_DisplayAspectRatio); } //Delay (in case of MPEG-PS) if (Temp->second.TimeCode_First!=(int64u)-1) { Fill(Temp->second.StreamKind, Temp->second.StreamPos, Fill_Parameter(Temp->second.StreamKind, Generic_Delay), Temp->second.TimeCode_First, 10); Fill(Temp->second.StreamKind, Temp->second.StreamPos, Fill_Parameter(Temp->second.StreamKind, Generic_Delay_Source), "Container"); } Merge(*Temp->second.Parser, Temp->second.StreamKind, 0, Temp->second.StreamPos); if (!Format_Profile.empty() && Format_Profile.find(Retrieve(Stream_Video, Temp->second.StreamPos, Video_Format_Profile))==0) Fill(Stream_Video, Temp->second.StreamPos, Video_Format_Profile, Format_Profile, true); } Temp++; } if (Count_Get(Stream_Video)==0 && Count_Get(Stream_Image)==0) Fill(Stream_General, 0, General_InternetMediaType, "audio/x-ms-wma", Unlimited, true, true); //Purge what is not needed anymore if (!File_Name.empty()) //Only if this is not a buffer, with buffer we can have more data Stream.clear(); }
//--------------------------------------------------------------------------- void File_Ogg::Streams_Fill() { std::map<int64u, stream>::iterator Stream_Temp=Stream.begin(); while (Stream_Temp!=Stream.end()) { //Filling if (Stream_Temp->second.Parser) { Stream_Temp->second.Parser->Fill(); Merge(*Stream_Temp->second.Parser); Merge(*Stream_Temp->second.Parser, Stream_General, 0, 0); Stream_Temp->second.StreamKind=((File_Ogg_SubElement*)Stream_Temp->second.Parser)->StreamKind; Stream_Temp->second.StreamPos=Count_Get(Stream_Temp->second.StreamKind)-1; if (!SizedBlocks && !XiphLacing) Stream_Temp->second.absolute_granule_position_Resolution=((File_Ogg_SubElement*)Stream_Temp->second.Parser)->absolute_granule_position_Resolution; if (Stream_Temp->second.StreamKind==Stream_Audio && Stream_Temp->second.absolute_granule_position_Resolution==0) Stream_Temp->second.absolute_granule_position_Resolution=Retrieve(Stream_Audio, Stream_Temp->second.StreamPos, Audio_SamplingRate).To_int64u(); if (!IsSub && Stream_Temp->second.absolute_granule_position && Stream_Temp->second.absolute_granule_position_Resolution) { if (Stream_Temp->second.StreamKind==Stream_Audio) Fill(Stream_Temp->second.StreamKind, Stream_Temp->second.StreamPos, Fill_Parameter(Stream_Temp->second.StreamKind, Generic_Duration), float64_int64s(((float64)(Stream_Temp->second.absolute_granule_position))*1000/Stream_Temp->second.absolute_granule_position_Resolution), 10, true); } if (!IsSub) { if (Stream_Temp->second.StreamKind==Stream_Max) { Stream_Temp->second.StreamKind=Stream_General; Stream_Temp->second.StreamPos=0; } Fill(Stream_Temp->second.StreamKind, Stream_Temp->second.StreamPos, General_ID, Stream_Temp->first); Fill(Stream_Temp->second.StreamKind, Stream_Temp->second.StreamPos, General_ID_String, Ztring::ToZtring(Stream_Temp->first)+__T(" (0x")+Ztring::ToZtring(Stream_Temp->first, 16)+__T(')'), true); } } ++Stream_Temp; } Fill(Stream_General, 0, General_Format, "OGG", Unlimited, true, true); if (Count_Get(Stream_Video)==0 && Count_Get(Stream_Image)==0) Fill(Stream_General, 0, General_InternetMediaType, "audio/ogg", Unlimited, true, true); }