//--------------------------------------------------------------------------- bool File_DolbyE::Descramble_16bit () { int16u ScrambleMask; Get_S2 (16, ScrambleMask, "Scramble mask"); int16u Size=((BigEndian2int16u(Buffer+Buffer_Offset+(size_t)Element_Size-Data_BS_Remain()/8)^ScrambleMask)>>2)&0x3FF; if (Data_BS_Remain()<(size_t)((Size+1)*BitDepth)) //+1 for additional unknown word return false; //There is a problem int8u* Temp=Descrambled_Buffer+(size_t)Element_Size-Data_BS_Remain()/8; for (int16u Pos=0; Pos<Size; Pos++) int16u2BigEndian(Temp+Pos*2, BigEndian2int16u(Temp+Pos*2)^ScrambleMask); return true; }
//--------------------------------------------------------------------------- // Big Endian - float 80 bits float80 BigEndian2float80(const char* Liste) { //sign 1 bit //exponent 15 bit //integer? 1 bit //significand 63 bit //Retrieving data int16u Integer1=BigEndian2int16u(Liste); int64u Integer2=BigEndian2int64u(Liste+2); //Retrieving elements bool Sign =(Integer1&0x8000)?true:false; int16u Exponent= Integer1&0x7FFF; int64u Mantissa= Integer2&0x7FFFFFFFFFFFFFFFLL; //Only 63 bits, 1 most significant bit is explicit //Some computing if (Exponent==0 || Exponent==0x7FFF) return 0; //These are denormalised numbers, NANs, and other horrible things Exponent-=0x3FFF; //Bias float80 Answer=(((float80)Mantissa)/9223372036854775808.0+1.0)*std::pow((float)2, (int)Exponent); //(1+Mantissa) * 2^Exponent if (Sign) Answer=-Answer; return (float80)Answer; }
bool File_DvbSubtitle::Demux_UnpacketizeContainer_Test() { if (Demux_Offset==0) { Demux_Offset=Buffer_Offset; } while (Demux_Offset<Buffer_Size) { bool MustBreak; switch (Buffer[Demux_Offset]) { case 0xFF : MustBreak=true; break; //0xFF is not in the demuxed frame default : MustBreak=false; } if (MustBreak) break; //while() loop if (Demux_Offset+6>Buffer_Size) return false; //No complete frame int16u segment_length=BigEndian2int16u(Buffer+Demux_Offset+4); Demux_Offset+=6+segment_length; if (Demux_Offset>=Buffer_Size) return false; //No complete frame } if (Demux_Offset>=Buffer_Size) return false; //No complete frame Demux_UnpacketizeContainer_Demux(); Demux_TotalBytes++; //0xFF is not demuxed return true; }
//--------------------------------------------------------------------------- // Big Endian - float 16 bits float32 BigEndian2float16(const char* Liste) { //sign 1 bit //exponent 5 bit //significand 10 bit //Retrieving data int16u Integer=BigEndian2int16u(Liste); //Retrieving elements bool Sign =(Integer&0x8000)?true:false; int32u Exponent=(Integer>>10)&0xFF; int32u Mantissa= Integer&0x03FF; //Some computing if (Exponent==0 || Exponent==0xFF) return 0; //These are denormalised numbers, NANs, and other horrible things Exponent-=0x0F; //Bias float64 Answer=(((float64)Mantissa)/8388608+1.0)*std::pow((float64)2, (int)Exponent); //(1+Mantissa) * 2^Exponent if (Sign) Answer=-Answer; return (float32)Answer; }
//--------------------------------------------------------------------------- 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; }
//--------------------------------------------------------------------------- void File_Tiff::GetValueOffsetu(ifditem &IfdItem) { ZtringList &Info=Infos[IfdItem.Tag]; Info.clear(); Info.Separator_Set(0, __T(" / ")); const char* Name=Tiff_Tag_Name(IfdItem.Tag); if (IfdItem.Count>=10) { //Too many data, we don't currently need it and we skip it Skip_XX(Element_Size-(Element_Offset+4), Name); Info.clear(); return; } switch (IfdItem.Type) { case 1: /* 8-bit unsigned integer. */ for (int16u Pos=0; Pos<IfdItem.Count; Pos++) { int8u Ret8; #if MEDIAINFO_TRACE if (LittleEndian) Get_L1 (Ret8, Name); else Get_B1 (Ret8, Name); Element_Info1(Ztring::ToZtring(Ret8)); #else //MEDIAINFO_TRACE if (Element_Offset+1>Element_Size) { Trusted_IsNot(); break; } if (LittleEndian) Ret8=LittleEndian2int8u(Buffer+Buffer_Offset+(size_t)Element_Offset); else Ret8=BigEndian2int8u(Buffer+Buffer_Offset+(size_t)Element_Offset); Element_Offset++; #endif //MEDIAINFO_TRACE Info.push_back(Ztring::ToZtring(Ret8)); } break; case 3: /* 16-bit (2-byte) unsigned integer. */ for (int16u Pos=0; Pos<IfdItem.Count; Pos++) { int16u Ret16; #if MEDIAINFO_TRACE if (LittleEndian) Get_L2 (Ret16, Name); else Get_B2 (Ret16, Name); switch (IfdItem.Tag) { case Tiff_Tag::Compression : Element_Info1(Tiff_Compression(Ret16)); break; case Tiff_Tag::PhotometricInterpretation : Element_Info1(Tiff_PhotometricInterpretation(Ret16)); break; default : Element_Info1(Ztring::ToZtring(Ret16)); } #else //MEDIAINFO_TRACE if (Element_Offset+2>Element_Size) { Trusted_IsNot(); break; } if (LittleEndian) Ret16=LittleEndian2int16u(Buffer+Buffer_Offset+(size_t)Element_Offset); else Ret16=BigEndian2int16u(Buffer+Buffer_Offset+(size_t)Element_Offset); Element_Offset+=2; #endif //MEDIAINFO_TRACE Info.push_back(Ztring::ToZtring(Ret16)); } break; case 4: /* 32-bit (4-byte) unsigned integer */ for (int16u Pos=0; Pos<IfdItem.Count; Pos++) { int32u Ret32; #if MEDIAINFO_TRACE if (LittleEndian) Get_L4 (Ret32, Name); else Get_B4 (Ret32, Name); Element_Info1(Ztring::ToZtring(Ret32)); #else //MEDIAINFO_TRACE if (Element_Offset+4>Element_Size) { Trusted_IsNot(); break; } if (LittleEndian) Ret32=LittleEndian2int32u(Buffer+Buffer_Offset+(size_t)Element_Offset); else Ret32=BigEndian2int32u(Buffer+Buffer_Offset+(size_t)Element_Offset); Element_Offset+=4; #endif //MEDIAINFO_TRACE Info.push_back(Ztring::ToZtring(Ret32)); } break; default: //Unknown { if (LittleEndian) Skip_L4( Name); else Skip_B4( Name); Info.clear(); //We actually do not know the type } } }