//--------------------------------------------------------------------------- void File_Aac::Read_Buffer_Continue () { //Tags if (File_Offset==0) { if (!Skip_ID3v2()) return; } //Parsing headers if (Buffer_Size<=8) ES(); //AAC in ES (.MP4) else if (CC4(Buffer)==CC4("ADIF")) ADIF(); //ADIF header else if ((CC2(Buffer+Buffer_Offset)&0xFFF6)==0xFFF0) ADTS(); //ADTS header (12 bits + ID + 2 bits) else if (CC3(Buffer)==CC3("AAC")) AAC(); //AAC header //No need of more File_Offset=File_Size; //Tags #if defined(MEDIAINFO_ID3_YES) /* File_Id3 Id3; if (Id3.Open(CompleteFileName)<0) Id3.Open(Buffer, Id3v2_Size); Merge(Id3); */ #endif //ID3 }
//--------------------------------------------------------------------------- bool File_DolbyE::Synchronize() { //Synchronizing while (Buffer_Offset+32<=Buffer_Size) { if ((CC2(Buffer+Buffer_Offset_Temp)&0xFFFE)==0x078E) //16-bit { BitDepth=16; ScrambledBitStream=(CC2(Buffer+Buffer_Offset)&0x0001)?true:false; break; //while() } if ((CC3(Buffer+Buffer_Offset)&0xFFFFE0)==0x0788E0) //20-bit { BitDepth=20; ScrambledBitStream=(CC3(Buffer+Buffer_Offset)&0x000010)?true:false; break; //while() } if ((CC3(Buffer+Buffer_Offset)&0xFFFFFE)==0x07888E) //24-bit { BitDepth=24; ScrambledBitStream=(CC3(Buffer+Buffer_Offset)&0x000001)?true:false; break; //while() } Buffer_Offset++; } //Parsing last bytes if needed if (Buffer_Offset+8>Buffer_Size) return false; //Synched return true; }
//--------------------------------------------------------------------------- bool File_Vc1::Header_Parser_QuickSearch() { while ( Buffer_Offset+4<=Buffer_Size && CC3(Buffer+Buffer_Offset)==0x000001) { //Getting start_code int8u start_code=CC1(Buffer+Buffer_Offset+3); //Searching start if (Streams[start_code].Searching_Payload) return true; //Getting size Buffer_Offset+=4; while(Buffer_Offset+4<=Buffer_Size && CC3(Buffer+Buffer_Offset)!=0x000001) { Buffer_Offset+=2; while(Buffer_Offset<Buffer_Size && Buffer[Buffer_Offset]!=0x00) Buffer_Offset+=2; if (Buffer_Offset<Buffer_Size && Buffer[Buffer_Offset-1]==0x00 || Buffer_Offset>=Buffer_Size) Buffer_Offset--; } } if (Buffer_Offset+4<=Buffer_Size) Trusted_IsNot("VC-1, Synchronisation lost"); Synched=false; return Synchronize(); }
//--------------------------------------------------------------------------- bool File_Ogg::Synchronize() { //Look for first Sync word if (Buffer_Offset_Temp==0) //Buffer_Offset_Temp is not 0 if Synchronize() has already parsed first bytes Buffer_Offset_Temp=Buffer_Offset; while (Buffer_Offset_Temp+4<=Buffer_Size && CC4(Buffer+Buffer_Offset_Temp)!=Ogg::OggS) Buffer_Offset_Temp++; //Not synched case if (!Synched && Buffer_Offset_Temp+4>Buffer_Size) { if (Buffer_Offset_Temp+3==Buffer_Size) { if (CC3(Buffer+Buffer_Offset_Temp)!=CC3("Ogg")) { Buffer_Offset_Temp++; if (CC2(Buffer+Buffer_Offset_Temp)!=CC2("Og")) { Buffer_Offset_Temp++; if (CC1(Buffer+Buffer_Offset_Temp)!=CC1("O")) Buffer_Offset_Temp++; } } } Buffer_Offset=Buffer_Offset_Temp; Buffer_Offset_Temp=0; return false; } //Must wait more data? if (Buffer_Offset_Temp+4>Buffer_Size) return false; //Error in stream? if (Buffer_Offset_Temp-Buffer_Offset>0) { if (Synched) Trusted_IsNot("Sync error"); else Info("Synchronization"); } //OK, we continue Buffer_Offset=Buffer_Offset_Temp; Buffer_Offset_Temp=0; Synched=true; return true; }
//--------------------------------------------------------------------------- bool File_Dirac::Synchronize() { //Synchronizing while (Buffer_Offset+5<=Buffer_Size && CC4(Buffer+Buffer_Offset)!=0x42424344) //"BBCD" Buffer_Offset++; if (Buffer_Offset+5>Buffer_Size) { //Parsing last bytes if (Buffer_Offset+4==Buffer_Size) { if (CC4(Buffer+Buffer_Offset)!=0x42424344) { Buffer_Offset++; if (CC3(Buffer+Buffer_Offset)!=0x424243) { Buffer_Offset++; if (CC2(Buffer+Buffer_Offset)!=0x4242) { Buffer_Offset++; if (CC1(Buffer+Buffer_Offset)!=0x42) Buffer_Offset++; } } } } return false; } //Synched is OK Synched=true; return true; }
//--------------------------------------------------------------------------- bool File_Dirac::Synchronize() { //Synchronizing while(Buffer_Offset+4<=Buffer_Size && (Buffer[Buffer_Offset ]!=0x42 || Buffer[Buffer_Offset+1]!=0x42 || Buffer[Buffer_Offset+2]!=0x43 || Buffer[Buffer_Offset+3]!=0x44)) //"BBCD" { Buffer_Offset+=2; while(Buffer_Offset<Buffer_Size && Buffer[Buffer_Offset]!=0x42) Buffer_Offset+=2; if (Buffer_Offset>=Buffer_Size || Buffer[Buffer_Offset-1]==0x42) Buffer_Offset--; } //Parsing last bytes if needed if (Buffer_Offset+4>Buffer_Size) { if (Buffer_Offset+3==Buffer_Size && CC3(Buffer+Buffer_Offset)!=0x424243) //"BBC" Buffer_Offset++; if (Buffer_Offset+2==Buffer_Size && CC2(Buffer+Buffer_Offset)!=0x4242) //"BB" Buffer_Offset++; if (Buffer_Offset+1==Buffer_Size && CC1(Buffer+Buffer_Offset)!=0x42) //"B" Buffer_Offset++; return false; } //Synched is OK return true; }
//--------------------------------------------------------------------------- bool File_Wvpk::Synchronize() { //Specific case if (FromMKV) return true; //Tags bool Tag_Found; if (!File__Tags_Helper::Synchronize(Tag_Found)) return false; if (Tag_Found) return true; //Synchronizing while (Buffer_Offset+8<=Buffer_Size) { while (Buffer_Offset+8<=Buffer_Size && CC4(Buffer+Buffer_Offset)!=CC4("wvpk")) { Buffer_Offset++; } if (Buffer_Offset+8<=Buffer_Size)//Testing if size is coherant { //Testing next start, to be sure size_t Size=LittleEndian2int32u(Buffer+Buffer_Offset+4)+8; if (Buffer_Offset+Size+8>Buffer_Size) return false; //Need more data //Testing if (CC4(Buffer+Buffer_Offset+Size)!=CC4("wvpk")) Buffer_Offset++; else break; //while() } } //Parsing last bytes if needed if (Buffer_Offset+8>Buffer_Size) { if (Buffer_Offset+7==Buffer_Size && CC4(Buffer+Buffer_Offset)!=0x7776706B) //"wvpk" Buffer_Offset++; if (Buffer_Offset+6==Buffer_Size && CC4(Buffer+Buffer_Offset)!=0x7776706B) //"wvpk" Buffer_Offset++; if (Buffer_Offset+5==Buffer_Size && CC4(Buffer+Buffer_Offset)!=0x7776706B) //"wvpk" Buffer_Offset++; if (Buffer_Offset+4==Buffer_Size && CC4(Buffer+Buffer_Offset)!=0x7776706B) //"wvpk" Buffer_Offset++; if (Buffer_Offset+3==Buffer_Size && CC3(Buffer+Buffer_Offset)!=0x777670) //"wv" Buffer_Offset++; if (Buffer_Offset+2==Buffer_Size && CC2(Buffer+Buffer_Offset)!=0x7776) //"wv" Buffer_Offset++; if (Buffer_Offset+1==Buffer_Size && CC1(Buffer+Buffer_Offset)!=0x77) //"w" Buffer_Offset++; return false; } //Synched is OK return true; }
//--------------------------------------------------------------------------- bool File_AvsV::Header_Parser_Fill_Size() { //Look for next Sync word if (Buffer_Offset_Temp==0) //Buffer_Offset_Temp is not 0 if Header_Parse_Fill_Size() has already parsed first frames Buffer_Offset_Temp=Buffer_Offset+4; while (Buffer_Offset_Temp+4<=Buffer_Size && CC3(Buffer+Buffer_Offset_Temp)!=0x000001) { Buffer_Offset_Temp+=2; while(Buffer_Offset_Temp<Buffer_Size && Buffer[Buffer_Offset_Temp]!=0x00) Buffer_Offset_Temp+=2; if (Buffer_Offset_Temp<Buffer_Size && Buffer[Buffer_Offset_Temp-1]==0x00 || Buffer_Offset_Temp>=Buffer_Size) Buffer_Offset_Temp--; } //Must wait more data? if (Buffer_Offset_Temp+4>Buffer_Size) { if (FrameIsAlwaysComplete || File_Offset+Buffer_Size==File_Size) Buffer_Offset_Temp=Buffer_Size; //We are sure that the next bytes are a start else return false; } //OK, we continue Header_Fill_Size(Buffer_Offset_Temp-Buffer_Offset); Buffer_Offset_Temp=0; return true; }
//--------------------------------------------------------------------------- void File_DolbyE::Header_Parse() { //Filling if (IsSub) Header_Fill_Size(Buffer_Size-Buffer_Offset); else { //Looking for synchro //Synchronizing Buffer_Offset_Temp=Buffer_Offset+3; if (BitDepth==16) while (Buffer_Offset_Temp+2<=Buffer_Size) { if ((CC2(Buffer+Buffer_Offset_Temp)&0xFFFE)==0x078E) //16-bit break; //while() Buffer_Offset_Temp++; } if (BitDepth==20) while (Buffer_Offset_Temp+3<=Buffer_Size) { if ((CC3(Buffer+Buffer_Offset_Temp)&0xFFFFE0)==0x0788E0) //20-bit break; //while() Buffer_Offset_Temp++; } if (BitDepth==24) while (Buffer_Offset_Temp+3<=Buffer_Size) { if ((CC3(Buffer+Buffer_Offset_Temp)&0xFFFFFE)==0x07888E) //24-bit break; //while() Buffer_Offset_Temp++; } if (Buffer_Offset_Temp+(BitDepth>16?3:2)>Buffer_Size) { if (File_Offset+Buffer_Size==File_Size) Buffer_Offset_Temp=Buffer_Size; else { Element_WaitForMoreData(); return; } } Header_Fill_Size(Buffer_Offset_Temp-Buffer_Offset); } Header_Fill_Code(0, "Frame"); }
//--------------------------------------------------------------------------- bool File_DolbyE::Synched_Test() { //Must have enough buffer for having header if (Buffer_Offset+32>Buffer_Size) return false; //Quick test of synchro switch (BitDepth) { case 16 : if ((CC2(Buffer+Buffer_Offset)&0xFFFE )!=0x078E ) {Synched=false; return true;} break; case 20 : if ((CC3(Buffer+Buffer_Offset)&0xFFFFE0)!=0x0788E0) {Synched=false; return true;} break; case 24 : if ((CC3(Buffer+Buffer_Offset)&0xFFFFFE)!=0x07888E) {Synched=false; return true;} break; default : ; } //We continue return true; }
//--------------------------------------------------------------------------- bool File_Ogg::Synchronize() { //Synchronizing while (Buffer_Offset+4<=Buffer_Size) { while(Buffer_Offset+4<=Buffer_Size && (Buffer[Buffer_Offset ]!=0x4F || Buffer[Buffer_Offset+1]!=0x67 || Buffer[Buffer_Offset+2]!=0x67 || Buffer[Buffer_Offset+3]!=0x53)) //"OggS" { Buffer_Offset+=1+2; while(Buffer_Offset<Buffer_Size && Buffer[Buffer_Offset]!=0x67) Buffer_Offset+=2; if (Buffer_Offset>=Buffer_Size || Buffer[Buffer_Offset-1]==0x67) Buffer_Offset--; Buffer_Offset--; } if (Buffer_Offset+4<=Buffer_Size) //Testing if size is coherant { //Retrieving some info if (Buffer_Offset+27>Buffer_Size) return false; //Need more data int8u page_segments=CC1(Buffer+Buffer_Offset+26); if (Buffer_Offset+27+page_segments>Buffer_Size) return false; //Need more data size_t Size=0; for (int8u Pos=0; Pos<page_segments; Pos++) Size+=CC1(Buffer+Buffer_Offset+27+Pos); //Testing if (Buffer_Offset+27+page_segments+Size+4>Buffer_Size) return false; //Need more data if (CC4(Buffer+Buffer_Offset+27+page_segments+Size)!=0x4F676753) //"OggS" Buffer_Offset++; else break; } } //Parsing last bytes if needed if (Buffer_Offset+4>Buffer_Size) { if (Buffer_Offset+3==Buffer_Size && CC3(Buffer+Buffer_Offset)!=0x4F6767) //"Ogg" Buffer_Offset++; if (Buffer_Offset+2==Buffer_Size && CC2(Buffer+Buffer_Offset)!=0x4F67) //"Og" Buffer_Offset++; if (Buffer_Offset+1==Buffer_Size && CC1(Buffer+Buffer_Offset)!=0x4F) //"O" Buffer_Offset++; return false; } //Synched is OK return true; }
//--------------------------------------------------------------------------- // bool File_Aac::Skip_ID3v2 () { //Integrity if (Buffer_Size<10) return true; //Not possible to have ID3v2 //ID3 v2 present? if (CC3(Buffer+Buffer_Offset)==CC3("ID3")) { //ID3v2, must skip it here size_t Id3v2_Size=(Buffer[Buffer_Offset+6]<<21) | (Buffer[Buffer_Offset+7]<<14) | (Buffer[Buffer_Offset+8]<<7) | (Buffer[Buffer_Offset+9]<<0)+10; if (Id3v2_Size+4>Buffer_Size) return false; //Skipping it Buffer_Offset+=Id3v2_Size; } return true; }
//--------------------------------------------------------------------------- bool File_Skm::Synched_Test() { //Must have enough buffer for having header if (Buffer_Offset+3>Buffer_Size) return false; //Quick test of synchro if (CC3(Buffer+Buffer_Offset)!=0x000001) Synched=false; //We continue return true; }
//--------------------------------------------------------------------------- bool File_Gif::FileHeader_Begin() { //Element_Size if (Buffer_Size<3) return false; //Must wait for more data if (CC3(Buffer)!=0x474946) //"GIF" { Reject("GIF"); return false; } //All should be OK... return true; }
//--------------------------------------------------------------------------- bool File_Dirac::Synchronize() { //Synchronizing while (Buffer_Offset+5<=Buffer_Size && CC4(Buffer+Buffer_Offset)!=0x42424344) //"BBCD" Buffer_Offset++; if (Buffer_Offset+5>Buffer_Size) { //Parsing last bytes if (Buffer_Offset+4==Buffer_Size) { if (CC4(Buffer+Buffer_Offset)!=0x42424344) { Buffer_Offset++; if (CC3(Buffer+Buffer_Offset)!=0x424243) { Buffer_Offset++; if (CC2(Buffer+Buffer_Offset)!=0x4242) { Buffer_Offset++; if (CC1(Buffer+Buffer_Offset)!=0x42) Buffer_Offset++; } } } } return false; } //Synched is OK Synched=true; if (Streams.empty()) { //Count of a Packets Frame_Count=0; //Temp Dirac_base_video_format((int32u)-1, frame_width, frame_height, chroma_format, source_sampling, clean_width, clean_height, clean_left_offset, clean_top_offset, frame_rate, pixel_aspect_ratio); //Default stream values Streams.resize(0x100); Streams[0x00].Searching_Payload=true; //Sequence header } return true; }
//--------------------------------------------------------------------------- bool File_La::FileHeader_Begin() { if (!File__Tags_Helper::FileHeader_Begin()) return false; //Synchro if (Buffer_Offset+2>Buffer_Size) return false; if (CC3(Buffer+Buffer_Offset)!=0x4C4130) //"LA0" { File__Tags_Helper::Reject("LA"); return false; } return true; }
//--------------------------------------------------------------------------- bool File_Rkau::FileHeader_Begin() { if (!File__Tags_Helper::FileHeader_Begin()) return false; //Synchro if (Buffer_Offset+3>Buffer_Size) return false; if (CC3(Buffer+Buffer_Offset)!=0x524B41) //"RKA" { File__Tags_Helper::Reject("RKAU"); return false; } return true; }
//--------------------------------------------------------------------------- bool File_AvsV::Synched_Test() { //Must have enough buffer for having header if (Buffer_Offset+3>Buffer_Size) return false; //Quick test of synchro if (CC3(Buffer+Buffer_Offset)!=0x000001) Synched=false; //Quick search if (Synched && !Header_Parser_QuickSearch()) return false; //We continue return true; }
//--------------------------------------------------------------------------- bool File_Mpc::FileHeader_Begin() { //Tags if (!File__Tags_Helper::FileHeader_Begin()) return false; if (Buffer_Offset+4>Buffer_Size) return false; //Test if (CC3(Buffer)!=0x4D502B || (CC1(Buffer+3)&0x0F)!=7) //"MP+" version 7 { File__Tags_Helper::Reject("Musepack SV7"); return false; } return true; }
//--------------------------------------------------------------------------- bool File_Dirac::Synchronize() { //Synchronizing while (Buffer_Offset+5<=Buffer_Size && CC4(Buffer+Buffer_Offset)!=0x42424344) //"BBCD" Buffer_Offset++; //Parsing last bytes if needed if (Buffer_Offset+5>Buffer_Size) { if (Buffer_Offset+4==Buffer_Size && CC4(Buffer+Buffer_Offset)!=0x42424344) //"BBCD" Buffer_Offset++; if (Buffer_Offset+3==Buffer_Size && CC3(Buffer+Buffer_Offset)!=0x424243) //"BBC" Buffer_Offset++; if (Buffer_Offset+2==Buffer_Size && CC2(Buffer+Buffer_Offset)!=0x4242) //"BB" Buffer_Offset++; if (Buffer_Offset+1==Buffer_Size && CC1(Buffer+Buffer_Offset)!=0x42) //"B" Buffer_Offset++; return false; } //Synched is OK return true; }
//--------------------------------------------------------------------------- bool File_Dts::Synchronize() { //Synchronizing while (Buffer_Offset+6<=Buffer_Size && !(BigEndian2int16u (Buffer+Buffer_Offset+0)==0x7FFE && BigEndian2int16u (Buffer+Buffer_Offset+2)==0x8001) //16 bits and big endian bitstream && !(LittleEndian2int16u(Buffer+Buffer_Offset+0)==0x7FFE && LittleEndian2int16u(Buffer+Buffer_Offset+2)==0x8001) //16 bits and little endian bitstream && !(BigEndian2int16u (Buffer+Buffer_Offset+0)==0x1FFF && BigEndian2int16u (Buffer+Buffer_Offset+2)==0xE800 && (BigEndian2int16u (Buffer+Buffer_Offset+4)&0xFFF0)==0x07F0) //14 bits and big endian bitstream && !(LittleEndian2int16u(Buffer+Buffer_Offset+0)==0x1FFF && LittleEndian2int16u(Buffer+Buffer_Offset+2)==0xE800 && (LittleEndian2int16u(Buffer+Buffer_Offset+4)&0xFFF0)==0x07F0) //14 bits and little endian bitstream ) Buffer_Offset++; if (Buffer_Offset+6>Buffer_Size) { //Parsing last bytes if (Buffer_Offset+6==Buffer_Size) { if (CC4(Buffer+Buffer_Offset)!=0x7FFE8001) //For 6 bytes instead of 4 (14 bits) { Buffer_Offset++; if (CC4(Buffer+Buffer_Offset)!=0x7FFE8001) //For 6 bytes instead of 4 (14 bits) { Buffer_Offset++; if (CC4(Buffer+Buffer_Offset)!=0x7FFE8001) { Buffer_Offset++; if (CC3(Buffer+Buffer_Offset)!=0x7FFE80) { Buffer_Offset++; if (CC2(Buffer+Buffer_Offset)!=0x7FFE) { Buffer_Offset++; if (CC1(Buffer+Buffer_Offset)!=0x7F) Buffer_Offset++; } } } } } } //Delay if (Frame_Count==0) Delay+=Buffer_Offset; return false; } //Configuring and Delay if (Frame_Count==0) { if (0) ; else if (BigEndian2int16u (Buffer+Buffer_Offset)==0x7FFE) //16 bits and big endian bitstream { } else if (LittleEndian2int16u(Buffer+Buffer_Offset)==0x7FFE) //16 bits and little endian bitstream { BigEndian=false; } else if (BigEndian2int16u (Buffer+Buffer_Offset)==0x1FFF) //14 bits and big endian bitstream { Word=false; } else if (LittleEndian2int16u(Buffer+Buffer_Offset)==0x1FFF) //14 bits and little endian bitstream { Word=false; BigEndian=false; } SyncCode=CC4(Buffer+Buffer_Offset); //14-bits and Little endian are not yet supported if (!Word || !BigEndian) { Finnished(); return false; } //Delay Delay+=Buffer_Offset; } //Synched is OK Synched=true; return true; }