//--------------------------------------------------------------------------- void File_Flac::PICTURE() { //Parsing int32u PictureType, MimeType_Size, Description_Size, Data_Size; Ztring MimeType, Description; Get_B4 (PictureType, "Picture type"); Element_Info1(Id3v2_PictureType((int8u)PictureType)); Get_B4 (MimeType_Size, "MIME type size"); Get_Local(MimeType_Size, MimeType, "MIME type"); Get_B4 (Description_Size, "Description size"); Get_UTF8(Description_Size, Description, "Description"); Skip_B4( "Width"); Skip_B4( "Height"); Skip_B4( "Color depth"); Skip_B4( "Number of colors used"); Get_B4 (Data_Size, "Data size"); if (Element_Offset+Data_Size>Element_Size) return; //There is a problem std::string Data_Raw((const char*)(Buffer+(size_t)(Buffer_Offset+Element_Offset)), Data_Size); std::string Data_Base64(Base64::encode(Data_Raw)); Skip_XX(Element_Size-Element_Offset, "Data"); //Filling Fill(Stream_General, 0, General_Cover, "Yes"); Fill(Stream_General, 0, General_Cover_Description, Description); Fill(Stream_General, 0, General_Cover_Type, Id3v2_PictureType((int8u)PictureType)); Fill(Stream_General, 0, General_Cover_Mime, MimeType); Fill(Stream_General, 0, General_Cover_Data, Data_Base64); }
//--------------------------------------------------------------------------- void File_Mpeg4_Descriptors::Descriptor_05() { if (ObjectTypeId==0x00 && Parser==NULL) //If no ObjectTypeId detected { switch (KindOfStream) { case Stream_Video : #if defined(MEDIAINFO_MPEG4V_YES) delete Parser; Parser=new File_Mpeg4v; ((File_Mpeg4v*)Parser)->FrameIsAlwaysComplete=true; #endif break; case Stream_Audio : #if defined(MEDIAINFO_AAC_YES) delete Parser; Parser=new File_Aac; ((File_Aac*)Parser)->Mode=File_Aac::Mode_AudioSpecificConfig; #endif break; default: ; } Element_Code=(int64u)-1; Open_Buffer_Init(Parser); } if (Parser==NULL) { Skip_XX(Element_Size, "Unknown"); return; } //Parser configuration before the parsing switch (ObjectTypeId) { case 0x60 : case 0x61 : case 0x62 : case 0x63 : case 0x64 : case 0x65 : case 0x6A : //MPEG Video #if defined(MEDIAINFO_MPEGV_YES) ((File_Mpegv*)Parser)->TimeCodeIsNotTrustable=true; #endif break; default: ; } //Parsing Open_Buffer_Continue(Parser); //Demux #if MEDIAINFO_DEMUX if (ObjectTypeId!=0x21 || !Config->Demux_Avc_Transcode_Iso14496_15_to_Iso14496_10_Get()) //0x21 is AVC switch (Config->Demux_InitData_Get()) { case 0 : //In demux event Demux_Level=2; //Container Demux(Buffer+Buffer_Offset, (size_t)Element_Size, ContentType_Header); break; case 1 : //In field { std::string Data_Raw((const char*)(Buffer+Buffer_Offset), (size_t)Element_Size); std::string Data_Base64(Base64::encode(Data_Raw)); Parser->Fill(KindOfStream, PosOfStream, "Demux_InitBytes", Data_Base64); if (PosOfStream<(*Parser->Stream_More)[KindOfStream].size()) (*Parser->Stream_More)[KindOfStream][PosOfStream](Ztring().From_Local("Demux_InitBytes"), Info_Options)=__T("N NT"); } break; default : ; } #endif //MEDIAINFO_DEMUX //Parser configuration after the parsing switch (ObjectTypeId) { case 0x60 : case 0x61 : case 0x62 : case 0x63 : case 0x64 : case 0x65 : case 0x6A : //MPEG Video #if defined(MEDIAINFO_MPEGV_YES) ((File_Mpegv*)Parser)->TimeCodeIsNotTrustable=false; #endif break; default: ; } //Positionning Element_Offset=Element_Size; }
Ztring File_Ibi_Creation::Finish() { //Test if (Buffers.empty()) return Ztring(); //Size computing size_t Size=4+1+2+1+15+2+1+1; //Header size for (size_t Pos=0; Pos<Buffers.size(); Pos++) Size+=Buffers[Pos]->Size; //Buffer creation int8u* Main=new int8u[Size]; size_t Main_Offset=0; //Header Main_Offset+=int64u2Ebml(Main+Main_Offset, 0x0A45DFA3); //EBML Main_Offset+=int64u2Ebml(Main+Main_Offset, 2+1+15+2+1+1); //Size (Code + Size + Content, twice) Main_Offset+=int64u2Ebml(Main+Main_Offset, 0x0282); //DocType Main_Offset+=int64u2Ebml(Main+Main_Offset, 15); //Size std::memcpy(Main+Main_Offset, "MediaInfo Index", 15); Main_Offset+=15; //Content Main_Offset+=int64u2Ebml(Main+Main_Offset, 0x0285); //DocTypeReadVersion Main_Offset+=int64u2Ebml(Main+Main_Offset, 1); //Size Main[Main_Offset]=0x01; Main_Offset+=1; //Content //for each stream for (size_t Pos=0; Pos<Buffers.size(); Pos++) { std::memcpy(Main+Main_Offset, Buffers[Pos]->Content, Buffers[Pos]->Size); Main_Offset+=Buffers[Pos]->Size; } //Compressed buffer Buffer; int8u* Compressed=new int8u[Main_Offset]; unsigned long Compressed_OffsetWihtoutHeader=(unsigned long)Main_Offset; if (compress2(Compressed, &Compressed_OffsetWihtoutHeader, Main, (unsigned long)Main_Offset, Z_BEST_COMPRESSION)==Z_OK && Compressed_OffsetWihtoutHeader+100<Main_Offset) { size_t Header_Offset=4+1+2+1+15+2+1+1; //Same header Header_Offset+=int64u2Ebml(Main+Header_Offset, 0x02); //Compressed index Header_Offset+=int64u2Ebml(Main+Header_Offset, int64u2Ebml(NULL, Main_Offset)+Compressed_OffsetWihtoutHeader); //Size Header_Offset+=int64u2Ebml(Main+Header_Offset, Main_Offset); //Uncompressed size //Filling Buffer.Size=Header_Offset+Compressed_OffsetWihtoutHeader; Buffer.Content=new int8u[Buffer.Size]; std::memcpy(Buffer.Content, Main, Header_Offset); //Same header + Compressed index header std::memcpy(Buffer.Content+Header_Offset, Compressed, Compressed_OffsetWihtoutHeader); //Same header } else { //Filling Buffer.Size=Main_Offset; Buffer.Content=new int8u[Buffer.Size]; std::memcpy(Buffer.Content, Main, Main_Offset); } std::string Data_Raw((const char*)Buffer.Content, Buffer.Size); std::string Data_Base64(Base64::encode(Data_Raw)); return Ztring().From_UTF8(Data_Base64); }