예제 #1
0
 public void Append(TransportPackets packets)
 {
     while (packets.Count > 0)
     {
         packetList.Add(packets.TakeFirst());
         Count++;
     }
 }
예제 #2
0
 public TransportPackets Packetize(long initialPTS, ushort PID, ref int ContinuityCounter)
 {
     if (GeneratePTSPacket)
     {
         TransportPackets result = new TransportPackets();
         result.AddPacket(GeneratePTSPadding(initialPTS, PID, ref ContinuityCounter));
         return(result);
     }
     else
     {
         return(PacketizeFile(initialPTS, PID, ref ContinuityCounter));
     }
 }
예제 #3
0
        public TransportPackets ReadMorePackets(long InitialPTS, ushort PID)
        {
            TransportPackets result = new TransportPackets();

            if (Count == 0)
            {
                return(result);
            }

            result.Append(this[0].Packetize(InitialPTS, PID, ref ContinuityCounter));
            RemoveAt(0);

            return(result);
        }
예제 #4
0
        private void BufferMore()
        {
            if (Packets.Count == 0)
            {
                Packets = SubtitleItems.RegionList.ReadMorePackets(InitialPtsInt, PID);

                /*if (SubtitleItems.Count > 0 && SubtitleItems[0] != null)
                 * {
                 *  SubtitleItem item = SubtitleItems[0];
                 *  SubtitleItems.RemoveAt(0);
                 *
                 *  while (lastPresentationTime > 0 && (item.PresentationTime - lastPresentationTime) >= 650)
                 *  {
                 *      lastPresentationTime += 650;
                 *      packetizePadding(lastPresentationTime);
                 *  }
                 *
                 *  packetizeFile(item.fileName, item.PresentationTime);
                 *  lastPresentationTime = item.PresentationTime;
                 * }*/
            }
        }
예제 #5
0
        private TransportPackets PacketizeFile(long InitialPTS, ushort PID, ref int ContinuityCounter)
        {
            TransportPackets result = new TransportPackets();

            FileStream      inputFileStream = new FileStream(SourceFile, FileMode.Open, FileAccess.Read);
            BigEndianReader reader          = new BigEndianReader(inputFileStream);

            long timeStamp = PresentationTimeStamp + InitialPTS;

            long bytesRemaining = ItemLength;

            int i = 0;

            while (bytesRemaining > 0)
            {
                long stuffingBytes = 0;
                int  headerSize    = (i == 0) ? 18 : 4;
                if (bytesRemaining < 188 - headerSize)
                {
                    stuffingBytes = 188 - headerSize - bytesRemaining;
                }

                ByteArray transportData = new ByteArray();
                transportData.MaxSize = 188;

                //------------------------------
                // Transport Packet Header
                //------------------------------
                // sync_byte = 0x47					(8 bits)
                transportData.Append((byte)0x47);
                transportData.EnterBitMode();
                // transport_error_indicator		(1 bit)
                transportData.AppendBit(0);
                // payload_unit_start_indicator		(1 bit)
                transportData.AppendBit((byte)((i == 0) ? 1 : 0));
                // transport_priority				(1 bit)
                transportData.AppendBit(0);
                // PID								(13 bits)
                transportData.AppendBits(PID, 12, 0);
                // transport_scrambling_code		(2 bits)
                transportData.AppendBits((byte)0x0, 1, 0);
                // adaptation_field_control			(2 bits)
                transportData.AppendBits((byte)((stuffingBytes > 0) ? 0x3 : 0x1), 1, 0);
                // continuity_counter				(4 bits)
                transportData.AppendBits(ContinuityCounter, 3, 0);
                ContinuityCounter++;
                transportData.LeaveBitMode();

                long used = 4;
                if (stuffingBytes > 0)
                {
                    // Adaptation field for stuffing
                    stuffingBytes--;
                    used++;
                    transportData.Append((byte)stuffingBytes);
                    if (stuffingBytes > 0)
                    {
                        used += stuffingBytes;
                        stuffingBytes--;
                        transportData.Append((byte)0x00);       // flags field

                        for (int k = 0; k < stuffingBytes; k++)
                        {
                            transportData.Append((byte)0xFF);   // stuffing byte
                        }
                    }
                    //else
                    //    throw new Exception("Adaptation Field length = 0");
                }

                if (i == 0)
                {
                    //-------------------------------
                    // PES Packet Header
                    //-------------------------------
                    // packet_start_code_prefix			(24 bits)	(24)
                    // stream_id						(8 bits)	(32)
                    transportData.Append((uint)0x000001BD);
                    long packetLengthPosition = transportData.length;

                    ushort packetLength = (ushort)(ItemLength + 8);
                    // Fill with dummy value
                    transportData.Append(packetLength);

                    // '10'								(2 bits)	(02)	0x8000
                    // PES_scrambling_code				(2 bits)	(04)	0x0000
                    // PES_priority						(1 bit)		(05)	0x0000
                    // data_alignment_indicator			(1 bit)		(06)	0x0400
                    // copyright						(1 bit)		(07)	0x0000
                    // original_or_copy					(1 bit)		(08)	0x0000
                    // PTS_DTS_flags = '10'				(2 bits)	(10)	0x0080
                    // ESCR_flag						(1 bit)		(11)	0x0000
                    // ES_rate_flag						(1 bit)		(12)	0x0000
                    // DSM_trick_mode_flag				(1 bit)		(13)	0x0000
                    // additional_copy_info				(1 bit)		(14)	0x0000
                    // PES_CRC_flag						(1 bit)		(15)	0x0000
                    // PES_extension_flag				(1 bit)		(16)	0x0000
                    //														0x8480
                    transportData.Append((ushort)0x8480);

                    // PES_header_data_length = 0x05	(8 bits)	(08)
                    transportData.Append((byte)0x05);

                    //   '0010'							(4 bits)	(76)
                    //   PTS[32..30]					(3 bits)	(79)
                    //   marker_bit						(1 bit)		(80)
                    //   PTS[29..15]					(15 bits)	(95)
                    //   marker_bit						(1 bit)		(96)
                    //   PTS[14..0]						(15 bits)	(111)
                    //   marker_bit						(1 bit)		(112)
                    transportData.EnterBitMode();
                    transportData.AppendBits((byte)0x2, 3, 0);
                    transportData.AppendBits(timeStamp, 32, 30);
                    transportData.AppendBit(1);
                    transportData.AppendBits(timeStamp, 29, 15);
                    transportData.AppendBit(1);
                    transportData.AppendBits(timeStamp, 14, 0);
                    transportData.AppendBit(1);
                    transportData.LeaveBitMode();

                    used += 14;
                }

                int payloadLength = TimelineRegionList.PacketSize - (int)used;
                bytesRemaining -= payloadLength;
                for (int k = 0; k < payloadLength; k++)
                {
                    transportData.Append((byte)reader.ReadByte());
                }

                long bytesIntoStream = ((PacketStart - 1) + i) * TimelineRegionList.PacketSize * 27000000 / TimelineRegionList.ByteRate;
                long streamTime      = bytesIntoStream + (InitialPTS * 300);

                TransportPacket newPacket = new TransportPacket(transportData.buffer);
                newPacket.StreamTime   = (ulong)streamTime;
                newPacket.DecoderStamp = (ulong)timeStamp * 300;
                newPacket.PID          = PID;

                if (newPacket.StreamTime >= newPacket.DecoderStamp)
                {
                    throw new Exception("Packet is scheduled for delivery after decoder time");
                }

                result.AddPacket(newPacket);
                i++;
            }
            reader.Close();
            inputFileStream.Close();

            return(result);
        }