public Packet ReadPacketizedElementaryStreamHeader()
{
while (!Stream.Eof())
{
var StartCode = (uint)GetNextPacketAndSync();
var ChunkCodeType = (ChunkType)StartCode;
//ConsoleUtils.SaveRestoreConsoleColor(ConsoleColor.Yellow, () => { Console.Error.WriteLine("ReadPacketizedElementaryStreamHeader: {0}: {1:X2}", (ChunkType)StartCode, StartCode); });
switch (ChunkCodeType)
{
// PACK_START_CODE
case ChunkType.Start:
Stream.Skip(10);
continue;
// SYSTEM_HEADER_START_CODE
case ChunkType.SystemHeader:
Stream.Skip(14);
continue;
// PADDING_STREAM
// PRIVATE_STREAM_2
case ChunkType.ST_Private2:
case ChunkType.ST_Padding:
Stream.Skip(Read16());
continue;
}
if (
// Audio Stream
(StartCode >= 0x1C0 && StartCode <= 0x1CF) ||
// Video Stream
(StartCode >= 0x1E0 && StartCode <= 0x1EF) ||
// Private Stream (Atrac3+)
ChunkCodeType == ChunkType.ST_Private1||
// ???
StartCode == 0x1fd
)
{
// Found packet.
//Console.WriteLine("Position: 0x{0:X}", Stream.Position);
ushort PacketSize = Read16();
var PacketStream = Stream.ReadStreamCopy(PacketSize);
if (PacketStream.Length != PacketSize) throw(new Exception("Didn't read the entire packet"));
return new Packet()
{
Type = (ChunkType)StartCode,
Stream = PacketStream,
};
}
//throw(new NotImplementedException(String.Format("Invalid stream 0x{0:X}", StartCode)));
Console.Error.WriteLine("Invalid stream 0x{0:X}", StartCode);
}
throw(new EndOfStreamException());
}