//--------------------------------------------------------------------------- void File_Cdxa::FileHeader_Parse() { //Parsing Skip_C4( "RIFF header"); Skip_L4( "RIFF data size"); Skip_C4( "CDXA"); Skip_C4( "fmt header"); Skip_L4( "fmt size"); Skip_L2( "user_id"); Skip_L2( "group_id"); Skip_L2( "attributes"); Skip_C2( "xa_signature"); Skip_L4( "xa_track_number"); Skip_L4( "reserved"); Skip_C4( "data header"); Skip_L4( "data size"); FILLING_BEGIN(); Accept("CDXA"); MI=new MediaInfo_Internal; MI->Option(_T("FormatDetection_MaximumOffset"), _T("1048576")); //MI->Option(_T("File_IsSub"), _T("1")); MI->Open_Buffer_Init(File_Size, File_Offset+Buffer_Offset); FILLING_END(); }
//--------------------------------------------------------------------------- void File_Nut::stream() { Element_Name("stream"); //Parsing int64u stream_class, fourcc_length, codec_specific_data_length; Skip_VS( "stream_id"); Get_VS (stream_class, "stream_class"); Get_VS (fourcc_length, "fourcc length"); switch (fourcc_length) { case 2 : Skip_C2( "fourcc"); break; case 4 : Skip_C4( "fourcc"); break; default: Skip_XX(fourcc_length, "fourcc"); } Skip_VS( "time_base_id"); Skip_VS( "msb_pts_shift"); Skip_VS( "max_pts_distance"); Skip_VS( "decode_delay"); Skip_VS( "stream_flags"); Get_VS (codec_specific_data_length, "codec_specific_data length"); Skip_XX(codec_specific_data_length, "codec_specific_data"); switch (stream_class) { case 0 : //video { Skip_VS( "width"); Skip_VS( "height"); Skip_VS( "sample_width"); Skip_VS( "sample_height"); Skip_VS( "colorspace_type"); } break; case 1 : //audio { Skip_VS( "samplerate_num"); Skip_VS( "samplerate_denom"); Skip_VS( "channel_count"); } break; case 2 : //subtitles { } break; case 3 : //userdata { } break; default: ; } if (Element_Offset!=Element_Size) Skip_XX(Element_Size - Element_Offset, "Data"); }
//--------------------------------------------------------------------------- void File_Bmp::Read_Buffer_Continue() { //Parsing int32u Size, DIB_Size, Offset; Element_Begin1("File header"); Skip_C2( "Magic"); Get_L4 (Size, "Size"); Skip_L2( "Reserved"); Skip_L2( "Reserved"); Get_L4 (Offset, "Offset of data"); Element_End0(); FILLING_BEGIN(); if (Size!=(int32u)-1 && Size!=File_Size) { Reject("BMP"); return; } Accept("BMP"); Fill(Stream_General, 0, General_Format, "Bitmap"); Stream_Prepare(Stream_Image); FILLING_END(); Element_Begin1("DIB header"); Peek_L4 (DIB_Size); switch (DIB_Size) { case 12 : BitmapCoreHeader(1); break; case 40 : BitmapInfoHeader(1); break; case 52 : BitmapInfoHeader(2); break; case 56 : BitmapInfoHeader(3); break; case 64 : BitmapCoreHeader(2); break; case 108 : BitmapInfoHeader(4); break; case 124 : BitmapInfoHeader(5); break; default : if (DIB_Size>124) { BitmapInfoHeader((int8u)-1); //Future versions of BitmapInfoHeader (OS/2 is abandonned) Skip_XX(14+124-Element_Offset, "Unknown"); } } Element_End0(); if (Element_Offset<Offset) Skip_XX(Offset-Element_Offset, "Other header data"); Skip_XX(File_Size-Offset, "Image data"); //No need of more Finish("BMP"); }
//--------------------------------------------------------------------------- void File_Bmp::Read_Buffer_Continue() { //Parsing int32u Size, DIB_Size, Offset; Element_Begin("File header", 14); Skip_C2( "Magic"); Get_L4 (Size, "Size"); Skip_L2( "Reserved"); Skip_L2( "Reserved"); Get_L4 (Offset, "Offset of data"); Element_End(); FILLING_BEGIN(); if (Size!=File_Size) { Reject("BMP"); return; } Accept("BMP"); Fill(Stream_General, 0, General_Format, "Bitmap"); Stream_Prepare(Stream_Image); FILLING_END(); Element_Begin("DIB header"); Peek_L4 (DIB_Size); switch (DIB_Size) { case 12 : Skip_XX(DIB_Size-4, "OS/2 v1 header"); break; case 40 : BitmapInfoHeader(); break; case 52 : Skip_XX(DIB_Size-4, "BitmapV2Header"); break; case 56 : Skip_XX(DIB_Size-4, "BitmapV3Header"); break; case 64 : Skip_XX(DIB_Size-4, "OS/2 v2 header"); break; case 108 : BitmapV4Header(); break; case 124 : Skip_XX(DIB_Size-4, "BitmapV5Header"); break; default : Skip_XX(DIB_Size-4, "Unknown header"); ; } Element_End(); Skip_XX(Offset-Element_Offset, "Color palette"); Skip_XX(Element_Size-Offset, "Bitmap data"); //No need of more Finish("BMP"); }
//--------------------------------------------------------------------------- // RIFF Header, 44 bytes // RIFF header 4 bytes, Pos=0 // RIFF data size 4 bytes, Pos=4 // Format (CDXA) 4 bytes, Pos=8 // Format Header 4 bytes, Pos=12 // Format Size 4 bytes, Pos=16 // Format user_id 2 bytes, Pos=20 // Format group_id 2 bytes, Pos=22 // Format attributes 2 bytes, Pos=24 // Format xa_signature 2 bytes, Pos=26 ("XA") // Format xa_track_number 4 bytes, Pos=28 // Format Reserved 4 bytes, Pos=32 // Data Header 4 bytes, Pos=36 // Data Size 4 bytes, Pos=40 // // Attributes (big endian): // 15 Directory // 14 CDDA // 13 Interleaved // 12 Mode2Form2 --> 2324 bytes/block // 11 Mode2Form1 --> 2048 bytes/block // 10 Exec_Other // 09 Reserved // 08 Read_Other // 07 Reserved // 06 Exec_Group // 05 Reserved // 04 Read_Group // 03 Reserved // 02 Exec_User // 01 Reserved // 00 Read_User // void File_Cdxa::FileHeader_Parse() { //Parsing if ( CC4(Buffer+Buffer_Offset+0x00)!=CC4("RIFF") || LittleEndian2int32u(Buffer+Buffer_Offset+0x04)!=LittleEndian2int32u(Buffer+Buffer_Offset+0x28)+0x24 //Sizes of chunks || CC4(Buffer+Buffer_Offset+0x08)!=CC4("CDXA") || CC4(Buffer+Buffer_Offset+0x0C)!=CC4("fmt ") || LittleEndian2int32u(Buffer+Buffer_Offset+0x10)!=0x10 || CC4(Buffer+Buffer_Offset+0x24)!=CC4("data") ) { Finnished(); return; } //Parsing Element_Begin("CDXA header"); Skip_C4( "RIFF header"); Skip_L4( "RIFF data size"); Skip_C4( "CDXA"); Skip_C4( "fmt header"); Skip_L4( "fmt size"); Skip_L2( "user_id"); Skip_L2( "group_id"); Skip_L2( "attributes"); Skip_C2( "xa_signature"); Skip_L4( "xa_track_number"); Skip_L4( "reserved"); Skip_C4( "data header"); Skip_L4( "data size"); Element_End(); FILLING_BEGIN(); if (MI==NULL) MI=new MediaInfo; Stream_Prepare(Stream_General); FILLING_END(); }
//--------------------------------------------------------------------------- void File_Cdxa::FileHeader_Parse() { //Parsing Skip_C4( "RIFF header"); Skip_L4( "RIFF data size"); Skip_C4( "CDXA"); Skip_C4( "fmt header"); Skip_L4( "fmt size"); Skip_L2( "user_id"); Skip_L2( "group_id"); Skip_L2( "attributes"); Skip_C2( "xa_signature"); Skip_L4( "xa_track_number"); Skip_L4( "reserved"); Skip_C4( "data header"); Skip_L4( "data size"); FILLING_BEGIN(); MI=new MediaInfo_Internal; MI->Option(_T("FormatDetection_MaximumOffset"), _T("1048576")); Stream_Prepare(Stream_General); Accept("CDXA"); FILLING_END(); }
//--------------------------------------------------------------------------- void File_Mz::Read_Buffer_Continue() { //Parsing int32u lfanew; Element_Begin("MZ"); Skip_C2( "magic"); Skip_L2( "cblp"); Skip_L2( "cp"); Skip_L2( "crlc"); Skip_L2( "cparhdr"); Skip_L2( "minalloc"); Skip_L2( "maxalloc"); Skip_L2( "ss"); Skip_L2( "sp"); Skip_L2( "csum"); Skip_L2( "ip"); Skip_L2( "cs"); Skip_L2( "lsarlc"); Skip_L2( "ovno"); Skip_L2( "res"); Skip_L2( "res"); Skip_L2( "res"); Skip_L2( "res"); Skip_L2( "oemid"); Skip_L2( "oeminfo"); Skip_L2( "res2"); Skip_L2( "res2"); Skip_L2( "res2"); Skip_L2( "res2"); Skip_L2( "res2"); Skip_L2( "res2"); Skip_L2( "res2"); Skip_L2( "res2"); Skip_L2( "res2"); Skip_L2( "res2"); Get_L4 (lfanew, "lfanew"); //Computing if (lfanew>Element_Offset) { Skip_XX(lfanew-Element_Offset, "MZ data"); Element_End(); } if (Element_Offset>lfanew) { Element_End(); Element_Offset=lfanew; //Multi usage off the first bytes } //Parsing int32u Signature, TimeDateStamp=0; int16u Machine=0, Characteristics=0; Peek_B4(Signature); if (Signature==0x50450000) //"PE" { Element_Begin("PE"); Skip_C4( "Header"); Get_L2 (Machine, "Machine"); Param_Info(Mz_Machine(Machine)); Skip_L2( "NumberOfSections"); Get_L4 (TimeDateStamp, "TimeDateStamp"); Param_Info(Ztring().Date_From_Seconds_1970(TimeDateStamp)); Skip_L4( "PointerToSymbolTable"); Skip_L4( "NumberOfSymbols"); Skip_L2( "SizeOfOptionalHeader"); Get_L2 (Characteristics, "Characteristics"); Element_End("PE"); } FILLING_BEGIN(); Accept("MZ"); Fill(Stream_General, 0, General_Format, "MZ"); if (Characteristics&0x2000) Fill(Stream_General, 0, General_Format_Profile, "DLL"); else if (Characteristics&0x0002) Fill(Stream_General, 0, General_Format_Profile, "Executable"); Fill(Stream_General, 0, General_Format_Profile, Mz_Machine(Machine)); if (TimeDateStamp) Fill(Stream_General, 0, General_Encoded_Date, Ztring().Date_From_Seconds_1970(TimeDateStamp)); //No more need data Finish("MZ"); FILLING_END(); }