// ---------- SPECIFIC MEMBERS public static VorbisMetaDataBlockPicture ReadMetadataBlockPicture(Stream s) { VorbisMetaDataBlockPicture result = new VorbisMetaDataBlockPicture(); int stringLen; BinaryReader r = new BinaryReader(s); result.nativePicCode = StreamUtils.ReverseInt32(r.ReadInt32()); result.picType = ID3v2.DecodeID3v2PictureType(result.nativePicCode); stringLen = StreamUtils.ReverseInt32(r.ReadInt32()); result.mimeType = Utils.Latin1Encoding.GetString(r.ReadBytes(stringLen)); stringLen = StreamUtils.ReverseInt32(r.ReadInt32()); result.description = Encoding.UTF8.GetString(r.ReadBytes(stringLen)); result.width = StreamUtils.ReverseInt32(r.ReadInt32()); result.height = StreamUtils.ReverseInt32(r.ReadInt32()); result.colorDepth = StreamUtils.ReverseInt32(r.ReadInt32()); result.colorNum = StreamUtils.ReverseInt32(r.ReadInt32()); result.picDataLength = StreamUtils.ReverseInt32(r.ReadInt32()); result.picDataOffset = 4 + 4 + result.mimeType.Length + 4 + result.description.Length + 4 + 4 + 4 + 4 + 4; return(result); }
public void readTagField(BinaryReader source, string zoneCode, string fieldName, ushort fieldDataType, int fieldDataSize, ReadTagParams readTagParams, bool isExtendedHeader = false, ushort languageIndex = 0, ushort streamNumber = 0) { string fieldValue = ""; bool setMeta = true; addFrameClass(fieldName, fieldDataType); if (0 == fieldDataType) // Unicode string { fieldValue = Utils.StripEndingZeroChars(Encoding.Unicode.GetString(source.ReadBytes(fieldDataSize))); } else if (1 == fieldDataType) // Byte array { if (fieldName.ToUpper().Equals("WM/PICTURE")) { byte picCode = source.ReadByte(); // TODO factorize : abstract PictureTypeDecoder + unsupported / supported decision in MetaDataIO ? PictureInfo.PIC_TYPE picType = ID3v2.DecodeID3v2PictureType(picCode); int picturePosition; if (picType.Equals(PictureInfo.PIC_TYPE.Unsupported)) { addPictureToken(MetaDataIOFactory.TAG_NATIVE, picCode); picturePosition = takePicturePosition(MetaDataIOFactory.TAG_NATIVE, picCode); } else { addPictureToken(picType); picturePosition = takePicturePosition(picType); } if (readTagParams.ReadPictures) { int picSize = source.ReadInt32(); string mimeType = StreamUtils.ReadNullTerminatedString(source, Encoding.Unicode); string description = StreamUtils.ReadNullTerminatedString(source, Encoding.Unicode); PictureInfo picInfo = PictureInfo.fromBinaryData(source.BaseStream, picSize, picType, getImplementedTagType(), picCode, picturePosition); picInfo.Description = description; tagData.Pictures.Add(picInfo); } setMeta = false; } else { source.BaseStream.Seek(fieldDataSize, SeekOrigin.Current); } } else if (2 == fieldDataType) // 16-bit Boolean (metadata); 32-bit Boolean (extended header) { if (isExtendedHeader) { fieldValue = source.ReadUInt32().ToString(); } else { fieldValue = source.ReadUInt16().ToString(); } } else if (3 == fieldDataType) // 32-bit unsigned integer { uint intValue = source.ReadUInt32(); if (fieldName.Equals("WM/GENRE", StringComparison.OrdinalIgnoreCase)) { intValue++; } fieldValue = intValue.ToString(); } else if (4 == fieldDataType) // 64-bit unsigned integer { fieldValue = source.ReadUInt64().ToString(); } else if (5 == fieldDataType) // 16-bit unsigned integer { fieldValue = source.ReadUInt16().ToString(); } else if (6 == fieldDataType) // 128-bit GUID; unused for now { source.BaseStream.Seek(fieldDataSize, SeekOrigin.Current); } if (setMeta) { SetMetaField(fieldName.Trim(), fieldValue, readTagParams.ReadAllMetaFrames, zoneCode, 0, streamNumber, decodeLanguage(source.BaseStream, languageIndex)); } }