void File_Ibi::Stream_Dts() { Element_Name("DTS"); //Parsing int64u Item; Get_EB (Item, "DtsFrequencyNumerator"); #if MEDIAINFO_IBIUSAGE FILLING_BEGIN(); if (Ibi) Ibi->Streams[ID_Current]->DtsFrequencyNumerator=Item; FILLING_END(); #endif //MEDIAINFO_IBIUSAGE Get_EB (Item, "DtsFrequencyDenominator"); #if MEDIAINFO_IBIUSAGE FILLING_BEGIN(); if (Ibi) { Ibi->Streams[ID_Current]->DtsFrequencyDenominator=Item; //Handling of previous inverted Numerator/Denominator if (Ibi->Streams[ID_Current]->DtsFrequencyNumerator<Ibi->Streams[ID_Current]->DtsFrequencyDenominator) std::swap(Ibi->Streams[ID_Current]->DtsFrequencyNumerator, Ibi->Streams[ID_Current]->DtsFrequencyDenominator); } FILLING_END(); #endif //MEDIAINFO_IBIUSAGE #if MEDIAINFO_IBIUSAGE size_t Pos=0; #endif //MEDIAINFO_IBIUSAGE int64u Offset=0; while (Element_Offset<Element_Size) { int64u Item; Get_EB (Item, "Item"); Offset+=Item; #if MEDIAINFO_IBIUSAGE Param_Info1(Pos); #endif //MEDIAINFO_IBIUSAGE Param_Info1(Ztring::ToZtring(Offset)+__T(" (0x")+Ztring::ToZtring(Offset, 16)+__T(')')); #if MEDIAINFO_IBIUSAGE FILLING_BEGIN(); if (Ibi) { //Filling information for ID after data if (Ibi->Streams[ID_Current]==NULL) Ibi->Streams[ID_Current]=new ibi::stream(); if (Pos>=Ibi->Streams[ID_Current]->Infos.size()) { Ibi->Streams[ID_Current]->Infos.push_back(ibi::stream::info()); Ibi->Streams[ID_Current]->Infos[Pos].IsContinuous=true; //default } Ibi->Streams[ID_Current]->Infos[Pos].Dts=Offset; Pos++; } FILLING_END(); #endif //MEDIAINFO_IBIUSAGE } }
void File_Ibi::Stream_FrameNumber() { Element_Name("Frame Number"); //Parsing size_t Pos=0; int64u Offset=0; while (Element_Offset<Element_Size) { int64u Item; Get_EB (Item, "Item"); Offset+=Item; Param_Info(Pos); Param_Info(Ztring::ToZtring(Offset)+_T(" (0x")+Ztring::ToZtring(Offset, 16)+_T(')')); FILLING_BEGIN(); if (Ibi) { //Filling information for ID after data if (Ibi->Streams[ID_Current]==NULL) Ibi->Streams[ID_Current]=new ibi::stream(); if (Pos>=Ibi->Streams[ID_Current]->Infos.size()) { Ibi->Streams[ID_Current]->Infos.push_back(ibi::stream::info()); Ibi->Streams[ID_Current]->Infos[Pos].IsContinuous=true; //default } Ibi->Streams[ID_Current]->Infos[Pos].FrameNumber=Offset; Pos++; } FILLING_END(); } }
//--------------------------------------------------------------------------- void File_Ibi::Header_Parse() { //Test of zero padding int8u Null; Peek_B1(Null); if (Null==0x00) { Skip_B1( "Zero byte"); Header_Fill_Code((int32u)-1); //Should be (int64u)-1 but Borland C++ does not like this Header_Fill_Size(1); return; } //Parsing int64u Name, Size; Get_EB (Name, "Name"); Get_EB (Size, "Size"); //Filling Header_Fill_Code(Name, Ztring().From_Number(Name, 16)); Header_Fill_Size(Element_Offset+Size); }
//--------------------------------------------------------------------------- void File_Ibi::Header_Parse() { //Test of zero padding int8u Null; Peek_B1(Null); if (Null==0x00) { if (Buffer_Offset_Temp==0) Buffer_Offset_Temp=Buffer_Offset+1; while (Buffer_Offset_Temp<Buffer_Size) { if (Buffer[Buffer_Offset_Temp]) break; Buffer_Offset_Temp++; } if (Buffer_Offset_Temp>=Buffer_Size) { Element_WaitForMoreData(); return; } Header_Fill_Code((int32u)-1); //Should be (int64u)-1 but Borland C++ does not like this Header_Fill_Size(Buffer_Offset_Temp-Buffer_Offset); Buffer_Offset_Temp=0; return; } //Parsing int64u Name, Size; Get_EB (Name, "Name"); Get_EB (Size, "Size"); //Filling Header_Fill_Code(Name, Ztring().From_Number(Name, 16)); Header_Fill_Size(Element_Offset+Size); }
void File_Ibi::Stream_Header() { Element_Name("Stream Header"); Get_EB (ID_Current, "ID"); FILLING_BEGIN(); if (Ibi) { //Filling information for ID after data ibi::streams::iterator IbiStream_Temp=Ibi->Streams.find((int64u)-1); if (IbiStream_Temp!=Ibi->Streams.end()) { Ibi->Streams[ID_Current]=IbiStream_Temp->second; Ibi->Streams.erase(IbiStream_Temp); } } FILLING_END(); }
void File_Ibi::Stream_ByteOffset() { Element_Name("Byte Offset"); //Parsing #if MEDIAINFO_IBIUSAGE size_t Pos=0; #endif //MEDIAINFO_IBIUSAGE int64u Offset=0; while (Element_Offset<Element_Size) { int64u Item; Get_EB (Item, "Item"); Offset+=Item; #if MEDIAINFO_IBIUSAGE Param_Info1(Pos); #endif //MEDIAINFO_IBIUSAGE Param_Info1(Ztring::ToZtring(Offset)+__T(" (0x")+Ztring::ToZtring(Offset, 16)+__T(')')); #if MEDIAINFO_IBIUSAGE FILLING_BEGIN(); if (Ibi) { //Filling information for ID after data if (Ibi->Streams[ID_Current]==NULL) Ibi->Streams[ID_Current]=new ibi::stream(); if (Pos>=Ibi->Streams[ID_Current]->Infos.size()) { Ibi->Streams[ID_Current]->Infos.push_back(ibi::stream::info()); Ibi->Streams[ID_Current]->Infos[Pos].IsContinuous=true; //default } Ibi->Streams[ID_Current]->Infos[Pos].StreamOffset=Offset; Pos++; } FILLING_END(); #endif //MEDIAINFO_IBIUSAGE } }
void File_Ibi::Stream_Header() { Element_Name("Stream Header"); Get_EB (ID_Current, "ID"); FILLING_BEGIN(); #if MEDIAINFO_IBIUSAGE if (Ibi) { //Filling information for ID after data ibi::streams::iterator IbiStream_Temp=Ibi->Streams.find((int64u)-1); if (IbiStream_Temp!=Ibi->Streams.end()) { Ibi->Streams[ID_Current]=IbiStream_Temp->second; Ibi->Streams.erase(IbiStream_Temp); } } #else //MEDIAINFO_IBIUSAGE Stream_Prepare(Stream_Video); Fill(Stream_Video, StreamPos_Last, General_ID, ID_Current); #endif //MEDIAINFO_IBIUSAGE FILLING_END(); }
void File_Ibi::CompressedIndex() { Element_Name("Compressed Index"); int64u UncompressedSize; Get_EB (UncompressedSize, "Uncompressed size"); //Sizes unsigned long Source_Size=(unsigned long)(Element_Size-Element_Offset); unsigned long Dest_Size=(unsigned long)UncompressedSize; //Uncompressing int8u* Dest=new int8u[Dest_Size]; if (uncompress((Bytef*)Dest, &Dest_Size, (const Bytef*)Buffer+Buffer_Offset+(size_t)Element_Offset, Source_Size)<0) { Skip_XX(Element_Size-Element_Offset, "Problem during the decompression"); delete[] Dest; //Dest=NULL; return; } //Exiting this element Skip_XX(Element_Size-Element_Offset, "Will be parsed"); //Configuring buffer const int8u* Buffer_Sav=Buffer; size_t Buffer_Size_Sav=Buffer_Size; int8u* Buffer_Temp_Sav=Buffer_Temp; size_t Buffer_Temp_Size_Sav=Buffer_Temp_Size; size_t Buffer_Offset_Sav=Buffer_Offset; size_t Buffer_Offset_Temp_Sav=Buffer_Offset_Temp; Buffer=NULL; Buffer_Size=0; Buffer_Temp=NULL; Buffer_Temp_Size=0; Buffer_Offset=0; Buffer_Offset_Temp=0; //Configuring level std::vector<int64u> Element_Sizes_Sav; size_t Element_Level_Sav=Element_Level; while(Element_Level) { Element_Sizes_Sav.push_back(Element_TotalSize_Get()); Element_End(); } //Configuring file size int64u File_Size_Sav=File_Size; if (File_Size<File_Offset+Buffer_Offset+Element_Offset+Dest_Size) File_Size=File_Offset+Buffer_Offset+Element_Offset+Dest_Size; Element_Level++; Header_Fill_Size(File_Size); Element_Level--; //Parsing Open_Buffer_Continue(Dest, Dest_Size); delete[] Dest; //Dest=NULL; //Resetting file size File_Size=File_Size_Sav; while(Element_Level) Element_End(); Element_Level++; Header_Fill_Size(File_Size); Element_Level--; //Configuring level while(Element_Level<Element_Level_Sav) { Element_Begin(); Element_Begin(); Header_Fill_Size(Element_Sizes_Sav[0]); Element_End(); } //Resetting buffer Buffer=Buffer_Sav; Buffer_Size=Buffer_Size_Sav; Buffer_Temp=Buffer_Temp_Sav; Buffer_Temp_Size=Buffer_Temp_Size_Sav; Buffer_Offset=Buffer_Offset_Sav; Buffer_Offset_Temp=Buffer_Offset_Temp_Sav; }