//============================================================================ // BDInfo - Blu-ray Video and Audio Analysis Tool // Copyright © 2010 Cinema Squid // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //============================================================================= using System; using System.Collections.Specialized; using System.IO; namespace BDInfo { public class TSStreamBuffer { private MemoryStream Stream = new MemoryStream(); private int SkipBits = 0; private byte[] Buffer; private int BufferLength = 0; public int TransferLength = 0; public TSStreamBuffer() { Buffer = new byte[4096]; Stream = new MemoryStream(Buffer); } public long Length => (long)BufferLength; public long Position => Stream.Position; public void Add( byte[] buffer, int offset, int length) { TransferLength += length; if (BufferLength + length >= Buffer.Length) { length = Buffer.Length - BufferLength; } if (length > 0) { Array.Copy(buffer, offset, Buffer, BufferLength, length); BufferLength += length; } } public void Seek( long offset, SeekOrigin loc) { Stream.Seek(offset, loc); } public void Reset() { BufferLength = 0; TransferLength = 0; } public void BeginRead() { SkipBits = 0; Stream.Seek(0, SeekOrigin.Begin); } public void EndRead() { } public byte[] ReadBytes(int bytes) { if (Stream.Position + bytes >= BufferLength) { return null; } byte[] value = new byte[bytes]; Stream.Read(value, 0, bytes); return value; } public byte ReadByte() { return (byte)Stream.ReadByte(); } public int ReadBits(int bits) { long pos = Stream.Position; int shift = 24; int data = 0; for (int i = 0; i < 4; i++) { if (pos + i >= BufferLength) break; data += (Stream.ReadByte() << shift); shift -= 8; } var vector = new BitVector32(data); int value = 0; for (int i = SkipBits; i < SkipBits + bits; i++) { value <<= 1; value += (vector[1 << (32 - i - 1)] ? 1 : 0); } SkipBits += bits; Stream.Seek(pos + (SkipBits >> 3), SeekOrigin.Begin); SkipBits = SkipBits % 8; return value; } } }