public EncodingInfo Read( Stream raf ) { EncodingInfo info = new EncodingInfo(); long oldPos = 0; //Reads the file encoding infos ----------------------------------- raf.Seek( 0 , SeekOrigin.Begin); double PCMSamplesNumber = -1; raf.Seek( raf.Length-2, SeekOrigin.Begin); while(raf.Position >= 4) { if(raf.ReadByte()==0x53) { raf.Seek( raf.Position - 4, SeekOrigin.Begin); byte[] ogg = new byte[3]; raf.Read(ogg, 0, 3); if(ogg[0]==0x4F && ogg[1]==0x67 && ogg[2]==0x67) { raf.Seek( raf.Position - 3, SeekOrigin.Begin); oldPos = raf.Position; raf.Seek(raf.Position + 26, SeekOrigin.Begin); int _pageSegments = raf.ReadByte()&0xFF; //Unsigned raf.Seek( oldPos , SeekOrigin.Begin); byte[] _b = new byte[27 + _pageSegments]; raf.Read( _b, 0, _b.Length ); OggPageHeader _pageHeader = new OggPageHeader( _b ); raf.Seek(0, SeekOrigin.Begin); PCMSamplesNumber = _pageHeader.AbsoluteGranulePosition; break; } } raf.Seek( raf.Position - 2, SeekOrigin.Begin); } if(PCMSamplesNumber == -1){ throw new CannotReadException("Error: Could not find the Ogg Setup block"); } //Supposing 1st page = codec infos // 2nd page = comment+decode info //...Extracting 1st page byte[] b = new byte[4]; oldPos = raf.Position; raf.Seek(26, SeekOrigin.Begin); int pageSegments = raf.ReadByte()&0xFF; //Unsigned raf.Seek( oldPos , SeekOrigin.Begin); b = new byte[27 + pageSegments]; raf.Read( b , 0, b .Length); OggPageHeader pageHeader = new OggPageHeader( b ); byte[] vorbisData = new byte[pageHeader.PageLength]; raf.Read( vorbisData , 0, vorbisData.Length); VorbisCodecHeader vorbisCodecHeader = new VorbisCodecHeader( vorbisData ); //Populates encodingInfo---------------------------------------------------- info.Duration = new TimeSpan((long)(PCMSamplesNumber / vorbisCodecHeader.SamplingRate) * TimeSpan.TicksPerSecond); info.ChannelNumber = vorbisCodecHeader.ChannelNumber; info.SamplingRate = vorbisCodecHeader.SamplingRate; info.EncodingType = vorbisCodecHeader.EncodingType; info.ExtraEncodingInfos = ""; if(vorbisCodecHeader.NominalBitrate != 0 && vorbisCodecHeader.MaxBitrate == vorbisCodecHeader.NominalBitrate && vorbisCodecHeader.MinBitrate == vorbisCodecHeader.NominalBitrate) { //CBR info.Bitrate = vorbisCodecHeader.NominalBitrate; info.Vbr = false; } else if(vorbisCodecHeader.NominalBitrate != 0 && vorbisCodecHeader.MaxBitrate == 0 && vorbisCodecHeader.MinBitrate == 0) { //Average vbr info.Bitrate = vorbisCodecHeader.NominalBitrate; info.Vbr = true; } else { info.Bitrate = ComputeBitrate( (int)info.Duration.TotalSeconds, raf.Length ); info.Vbr = true; } return info; }
public EncodingInfo Read(Stream raf) { EncodingInfo info = new EncodingInfo(); long oldPos = 0; //Reads the file encoding infos ----------------------------------- raf.Seek(0, SeekOrigin.Begin); double PCMSamplesNumber = -1; raf.Seek(raf.Length - 2, SeekOrigin.Begin); while (raf.Position >= 4) { if (raf.ReadByte() == 0x53) { raf.Seek(raf.Position - 4, SeekOrigin.Begin); byte[] ogg = new byte[3]; raf.Read(ogg, 0, 3); if (ogg[0] == 0x4F && ogg[1] == 0x67 && ogg[2] == 0x67) { raf.Seek(raf.Position - 3, SeekOrigin.Begin); oldPos = raf.Position; raf.Seek(raf.Position + 26, SeekOrigin.Begin); int _pageSegments = raf.ReadByte() & 0xFF; //Unsigned raf.Seek(oldPos, SeekOrigin.Begin); byte[] _b = new byte[27 + _pageSegments]; raf.Read(_b, 0, _b.Length); OggPageHeader _pageHeader = new OggPageHeader(_b); raf.Seek(0, SeekOrigin.Begin); PCMSamplesNumber = _pageHeader.AbsoluteGranulePosition; break; } } raf.Seek(raf.Position - 2, SeekOrigin.Begin); } if (PCMSamplesNumber == -1) { throw new CannotReadException("Error: Could not find the Ogg Setup block"); } //Supposing 1st page = codec infos // 2nd page = comment+decode info //...Extracting 1st page byte[] b = new byte[4]; oldPos = raf.Position; raf.Seek(26, SeekOrigin.Begin); int pageSegments = raf.ReadByte() & 0xFF; //Unsigned raf.Seek(oldPos, SeekOrigin.Begin); b = new byte[27 + pageSegments]; raf.Read(b, 0, b.Length); OggPageHeader pageHeader = new OggPageHeader(b); byte[] vorbisData = new byte[pageHeader.PageLength]; raf.Read(vorbisData, 0, vorbisData.Length); VorbisCodecHeader vorbisCodecHeader = new VorbisCodecHeader(vorbisData); //Populates encodingInfo---------------------------------------------------- info.Duration = new TimeSpan((long)(PCMSamplesNumber / vorbisCodecHeader.SamplingRate) * TimeSpan.TicksPerSecond); info.ChannelNumber = vorbisCodecHeader.ChannelNumber; info.SamplingRate = vorbisCodecHeader.SamplingRate; info.EncodingType = vorbisCodecHeader.EncodingType; info.ExtraEncodingInfos = ""; if (vorbisCodecHeader.NominalBitrate != 0 && vorbisCodecHeader.MaxBitrate == vorbisCodecHeader.NominalBitrate && vorbisCodecHeader.MinBitrate == vorbisCodecHeader.NominalBitrate) { //CBR info.Bitrate = vorbisCodecHeader.NominalBitrate; info.Vbr = false; } else if (vorbisCodecHeader.NominalBitrate != 0 && vorbisCodecHeader.MaxBitrate == 0 && vorbisCodecHeader.MinBitrate == 0) { //Average vbr info.Bitrate = vorbisCodecHeader.NominalBitrate; info.Vbr = true; } else { info.Bitrate = ComputeBitrate((int)info.Duration.TotalSeconds, raf.Length); info.Vbr = true; } return(info); }