//--------------------------------------------------------------------------- size_t Reader_File::Format_Test_PerParser(MediaInfo_Internal* MI, const String &File_Name) { //Opening the file F.Open(File_Name); if (!F.Opened_Get()) return 0; //Buffer Buffer_Size_Max=Buffer_NormalSize; Buffer=new int8u[Buffer_Size_Max]; //Partial file handling Ztring Config_Partial_Begin=MI->Config.File_Partial_Begin_Get(); if (!Config_Partial_Begin.empty() && Config_Partial_Begin[0]>=_T('0') && Config_Partial_Begin[0]<=_T('9')) { if (Config_Partial_Begin.find(_T('%'))==Config_Partial_Begin.size()-1) Partial_Begin=float64_int64s(F.Size_Get()*Config_Partial_Begin.To_float64()/100); else Partial_Begin=Config_Partial_Begin.To_int64u(); if (Partial_Begin) F.GoTo(Partial_Begin); } else Partial_Begin=0; Ztring Config_Partial_End=MI->Config.File_Partial_End_Get(); if (!Config_Partial_End.empty() && Config_Partial_End[0]>=_T('0') && Config_Partial_End[0]<=_T('9')) { if (Config_Partial_End.find(_T('%'))==Config_Partial_End.size()-1) Partial_End=float64_int64s(F.Size_Get()*Config_Partial_End.To_float64()/100); else Partial_End=Config_Partial_End.To_int64u(); } else Partial_End=F.Size_Get(); if (Partial_Begin>F.Size_Get()) Partial_Begin=0; //Wrong value if (Partial_End>F.Size_Get()) Partial_End=F.Size_Get(); //Wrong value if (Partial_Begin>Partial_End) { Partial_Begin=0; //Wrong value Partial_End=F.Size_Get(); //Wrong value } //Parser MI->Open_Buffer_Init(Partial_End-Partial_Begin, File_Name); //Test the format with buffer return Format_Test_PerParser_Continue(MI); }
//--------------------------------------------------------------------------- size_t Reader_File::Format_Test_PerParser(MediaInfo_Internal* MI, const String &File_Name) { //Opening the file F.Open(File_Name); if (!F.Opened_Get()) return 0; //Info Status=0; MI->Config.File_Size=F.Size_Get(); //Partial file handling Ztring Config_Partial_Begin=MI->Config.File_Partial_Begin_Get(); if (!Config_Partial_Begin.empty() && Config_Partial_Begin[0]>=_T('0') && Config_Partial_Begin[0]<=_T('9')) { if (Config_Partial_Begin.find(_T('%'))==Config_Partial_Begin.size()-1) Partial_Begin=float64_int64s(MI->Config.File_Size*Config_Partial_Begin.To_float64()/100); else Partial_Begin=Config_Partial_Begin.To_int64u(); if (Partial_Begin) F.GoTo(Partial_Begin); } else Partial_Begin=0; Ztring Config_Partial_End=MI->Config.File_Partial_End_Get(); if (!Config_Partial_End.empty() && Config_Partial_End[0]>=_T('0') && Config_Partial_End[0]<=_T('9')) { if (Config_Partial_End.find(_T('%'))==Config_Partial_End.size()-1) Partial_End=float64_int64s(MI->Config.File_Size*Config_Partial_End.To_float64()/100); else Partial_End=Config_Partial_End.To_int64u(); } else Partial_End=(int64u)-1; if (Partial_Begin>MI->Config.File_Size) Partial_Begin=0; //Wrong value if (Partial_Begin>Partial_End) Partial_Begin=0; //Wrong value //Parser MI->Open_Buffer_Init((Partial_End<=MI->Config.File_Size?Partial_End:MI->Config.File_Size)-Partial_Begin, File_Name); //Buffer MI->Option(_T("File_Buffer_Size_Hint_Pointer"), Ztring::ToZtring((size_t)(&MI->Config.File_Buffer_Size_ToRead))); MI->Config.File_Buffer_Repeat_IsSupported=true; //Test the format with buffer return Format_Test_PerParser_Continue(MI); }
//--------------------------------------------------------------------------- void File_Vc3::Data_Parse() { //Parsing if (Status[IsFilled]) { Skip_XX(Element_Size, "Data"); } else { Element_Info1(Frame_Count+1); HeaderPrefix(); CodingControlA(); Skip_XX(16, "Reserved"); ImageGeometry(); Skip_XX( 5, "Reserved"); CompressionID(); CodingControlB(); Skip_XX( 3, "Reserved"); TimeCode(); Skip_XX(640-Element_Offset, "ToDo"); Skip_XX(Element_Size-Element_Offset, "Data"); } FILLING_BEGIN(); Data_ToParse-=Buffer_Size-(size_t)Buffer_Offset; Frame_Count++; if (Frame_Count_NotParsedIncluded!=(int64u)-1) Frame_Count_NotParsedIncluded++; if (FrameRate) { FrameInfo.PTS=FrameInfo.DTS+=float64_int64s(1000000000/FrameRate); FrameInfo.DUR=float64_int64s(1000000000/FrameRate); } else { FrameInfo.PTS=FrameInfo.DTS=FrameInfo.DUR=(int64u)-1; } if (!Status[IsFilled] && Frame_Count>=Frame_Count_Valid) { Fill("VC-3"); if (!IsSub && Config->ParseSpeed<1) Finish("VC-1"); } FILLING_END(); }
//--------------------------------------------------------------------------- void File_DolbyE::Data_Parse() { //In case of scrambling const int8u* Save_Buffer=NULL; size_t Save_Buffer_Offset=0; int64u Save_File_Offset=0; if (ScrambledBitStream) { //We must change the buffer, Save_Buffer=Buffer; Save_Buffer_Offset=Buffer_Offset; Save_File_Offset=File_Offset; File_Offset+=Buffer_Offset; Buffer_Offset=0; Descrambled_Buffer=new int8u[(size_t)Element_Size]; std::memcpy(Descrambled_Buffer, Save_Buffer+Save_Buffer_Offset, (size_t)Element_Size); Buffer=Descrambled_Buffer; } //Parsing BS_Begin(); Block(); BS_End(); //In case of scrambling if (ScrambledBitStream) { delete[] Buffer; Buffer=Save_Buffer; Buffer_Offset=Save_Buffer_Offset; File_Offset=Save_File_Offset; } FILLING_BEGIN(); if (!Status[IsAccepted]) { Accept("Dolby E"); //Guard band GuardBand_Before_Initial=GuardBand_Before; GuardBand_After_Initial=GuardBand_After; } Frame_Count++; if (Frame_Count_NotParsedIncluded!=(int64u)-1) Frame_Count_NotParsedIncluded++; if (Mpegv_frame_rate[FrameRate]) FrameInfo.DUR=float64_int64s(1000000000/Mpegv_frame_rate[FrameRate]); else FrameInfo.DUR=(int64u)-1; if (FrameInfo.DTS!=(int64u)-1) FrameInfo.PTS=FrameInfo.DTS+=FrameInfo.DUR; if (Frame_Count==1) { Finish("Dolby E"); } FILLING_END(); if (Frame_Count==0 && Buffer_TotalBytes>Buffer_TotalBytes_FirstSynched_Max) Reject("Dolby E"); }
//--------------------------------------------------------------------------- int64s TimeCode::ToMilliseconds() { if (!FramesPerSecond) return 0; int64s MS=(int64s(Hours) *3600 + int64s(Minutes) * 60 + int64s(Seconds) )*1000 + float64_int64s((float64(Frames*(MustUseSecondField?2:1)+(IsSecondField?1:0)))*1000/(FramesPerSecond*(MustUseSecondField?2:1))); return IsNegative?-MS:MS; }
//--------------------------------------------------------------------------- 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); }
//--------------------------------------------------------------------------- void File_Ogg::Read_Buffer_Finalize() { std::map<int64u, stream>::iterator Stream_Temp=Stream.begin(); while (Stream_Temp!=Stream.end()) { //Filling if (Stream_Temp->second.absolute_granule_position_Resolution) Fill(Stream_Temp->second.StreamKind, Stream_Temp->second.StreamPos, "PlayTime", float64_int64s(((float64)(Stream_Temp->second.absolute_granule_position))*1000/Stream_Temp->second.absolute_granule_position_Resolution)); Stream_Temp++; } Fill(Stream_General, 0, "Format", "OGG"); }
//--------------------------------------------------------------------------- size_t Reader_File::Format_Test_PerParser(MediaInfo_Internal* MI, const String &File_Name) { //Init MI_Internal=MI; #if MEDIAINFO_READTHREAD ThreadInstance=NULL; Buffer_End2=0; //Is also used for counting bytes before activating the thread #endif //MEDIAINFO_READTHREAD //Opening the file F.Open(File_Name); if (!F.Opened_Get()) return 0; //Info Status=0; MI->Config.File_Size=F.Size_Get(); MI->Config.File_Current_Offset=0; MI->Config.File_Current_Size=MI->Config.File_Size; MI->Config.File_Sizes.clear(); MI->Config.File_Sizes.push_back(MI->Config.File_Size); if (MI->Config.File_Names.size()>1 #if MEDIAINFO_ADVANCED && !MI->Config.File_IgnoreSequenceFileSize_Get() #endif //MEDIAINFO_ADVANCED ) { for (size_t Pos=1; Pos<MI->Config.File_Names.size(); Pos++) { int64u Size=File::Size_Get(MI->Config.File_Names[Pos]); MI->Config.File_Sizes.push_back(Size); MI->Config.File_Size+=Size; } } //Partial file handling Ztring Config_Partial_Begin=MI->Config.File_Partial_Begin_Get(); if (!Config_Partial_Begin.empty() && Config_Partial_Begin[0]>=__T('0') && Config_Partial_Begin[0]<=__T('9')) { if (Config_Partial_Begin.find(__T('%'))==Config_Partial_Begin.size()-1) Partial_Begin=float64_int64s(MI->Config.File_Size*Config_Partial_Begin.To_float64()/100); else Partial_Begin=Config_Partial_Begin.To_int64u(); if (Partial_Begin) F.GoTo(Partial_Begin); } else Partial_Begin=0; Ztring Config_Partial_End=MI->Config.File_Partial_End_Get(); if (!Config_Partial_End.empty() && Config_Partial_End[0]>=__T('0') && Config_Partial_End[0]<=__T('9')) { if (Config_Partial_End.find(__T('%'))==Config_Partial_End.size()-1) Partial_End=float64_int64s(MI->Config.File_Size*Config_Partial_End.To_float64()/100); else Partial_End=Config_Partial_End.To_int64u(); } else Partial_End=(int64u)-1; if (Partial_Begin>MI->Config.File_Size) Partial_Begin=0; //Wrong value if (Partial_Begin>Partial_End) Partial_Begin=0; //Wrong value //Parser MI->Open_Buffer_Init((Partial_End<=MI->Config.File_Size?Partial_End:MI->Config.File_Size)-Partial_Begin, File_Name); //Buffer MI->Option(__T("File_Buffer_Size_Hint_Pointer"), Ztring::ToZtring((size_t)(&MI->Config.File_Buffer_Size_ToRead))); MI->Config.File_Buffer_Repeat_IsSupported=true; //Test the format with buffer return Format_Test_PerParser_Continue(MI); }