CSPspEmu.Hle.Formats.video.MpegPsDemuxer.ReadPacketizedElementaryStreamHeader C# (CSharp) Method

ReadPacketizedElementaryStreamHeader() public method

public ReadPacketizedElementaryStreamHeader ( ) : Packet
return Packet
        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());
        }

Usage Example

Example #1
0
 public void ReadPacketizedElementaryStreamHeaderTest()
 {
     MpegPsDemuxer.Packet Packet;
     var MpegPsDemuxer = new MpegPsDemuxer(File.OpenRead("../../../TestInput/test.pmf").SliceWithLength(0x800));
     for (int n = 0; n < 32; n++)
     {
         Packet = MpegPsDemuxer.ReadPacketizedElementaryStreamHeader();
         //if ((Packet.Type & 0xFF0) == 0x1E0)
         //if (Packet.Type == 0x1E0)
         {
             Console.WriteLine("0x{0:X}", Packet.Type);
             MpegPsDemuxer.ParsePacketizedStream(Packet.Stream);
         }
     }
 }