private int ScanBlockForStart(byte[] bytes, int bytesRead, int absoluteOffset, int offset) { while (offset < bytesRead - MINIMUM_BUFFER_LENGTH) { if (bytes[offset] == unchecked((byte)unchecked((int)(0xFF))) && (bytes[offset + 1 ] & unchecked((byte)unchecked((int)(0xE0)))) == unchecked((byte)unchecked((int)( 0xE0)))) { try { MpegFrame frame = new MpegFrame(bytes[offset], bytes[offset + 1], bytes[offset + 2], bytes[offset + 3]); if (xingOffset < 0 && IsXingFrame(bytes, offset)) { xingOffset = absoluteOffset + offset; xingBitrate = frame.GetBitrate(); offset += frame.GetLengthInBytes(); } else { startOffset = absoluteOffset + offset; channelMode = frame.GetChannelMode(); emphasis = frame.GetEmphasis(); layer = frame.GetLayer(); modeExtension = frame.GetModeExtension(); sampleRate = frame.GetSampleRate(); version = frame.GetVersion(); copyright = frame.IsCopyright(); original = frame.IsOriginal(); frameCount++; AddBitrate(frame.GetBitrate()); offset += frame.GetLengthInBytes(); return offset; } } catch (InvalidDataException) { offset++; } } else { offset++; } } return offset; }
/// <exception cref="Mp3net.InvalidDataException"></exception> private void SanityCheckFrame(MpegFrame frame, int offset) { if (sampleRate != frame.GetSampleRate()) { throw new InvalidDataException("Inconsistent frame header"); } if (!layer.Equals(frame.GetLayer())) { throw new InvalidDataException("Inconsistent frame header"); } if (!version.Equals(frame.GetVersion())) { throw new InvalidDataException("Inconsistent frame header"); } if (offset + frame.GetLengthInBytes() > GetLength()) { throw new InvalidDataException("Frame would extend beyond end of file"); } }