2019-01-13 12:54:44 -07:00
|
|
|
//============================================================================
|
2016-10-26 12:29:56 -07:00
|
|
|
// 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);
|
|
|
|
}
|
|
|
|
|
2019-01-13 13:31:14 -07:00
|
|
|
public long Length => (long)BufferLength;
|
2016-10-26 12:29:56 -07:00
|
|
|
|
2019-01-13 13:31:14 -07:00
|
|
|
public long Position => Stream.Position;
|
2016-10-26 12:29:56 -07:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
2019-01-13 13:37:13 -07:00
|
|
|
var vector = new BitVector32(data);
|
2016-10-26 12:29:56 -07:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|