AddData() public method

public AddData ( List moredata ) : void
moredata List
return void
Esempio n. 1
0
 private void MuxSingleDtsToTs(byte[] payload, int offset, int len, Int64 pts, ElementaryStreamTypes type, ushort pid)
 {
     List<byte> pes = new List<byte>();
     bool priority = false;
     pes.Add(0x00);
     pes.Add(0x00);
     pes.Add(0x01);
     if (this.fileType == TsFileType.BLU_RAY)
         pes.Add(0xfd);
     else
         pes.Add(0xbd);
     pes.Add(0x00);
     pes.Add(0x00);
     pes.Add(0x84);
     pes.Add(0x81);
     pes.Add(0x08);
     pes.Add(0x21);
     pes.Add(0x00);
     pes.Add(0x01);
     pes.Add(0x00);
     pes.Add(0x01);
     pes.Add(0x01);
     pes.Add(0x81);
     DtsInfo info = new DtsInfo(payload, offset);
     if (this.MlpToAc3 || (info.Valid && info.FrameSize == len))
     {
         pes.Add(0x71);
         priority = true;
     }
     else
     {
         pes.Add(0x72);
         priority = false;
     }
     PesHeader ph = new PesHeader(pes.ToArray());
     ph.Pts = pts;
     PesPacket pp = new PesPacket(ph.Data, 0, ph.Data.Length, pid);
     pp.AddData(payload, offset, len);
     pp.Complete = true;
     MuxPesPacketToTs(pp, priority);
 }
Esempio n. 2
0
 private void MuxSingleAc3ToTs(byte[] payload, int offset, int len, Int64 pts, ElementaryStreamTypes type, ushort pid)
 {
     List<byte> pes = new List<byte>();
     bool priority = false;
     pes.Add(0x00);
     pes.Add(0x00);
     pes.Add(0x01);
     if (this.fileType == TsFileType.BLU_RAY)
         pes.Add(0xfd);
     else
         pes.Add(0xbd);
     pes.Add(0x00);
     pes.Add(0x00);
     pes.Add(0x84);
     pes.Add(0x81);
     pes.Add(0x08);
     pes.Add(0x21);
     pes.Add(0x00);
     pes.Add(0x01);
     pes.Add(0x00);
     pes.Add(0x01);
     pes.Add(0x01);
     pes.Add(0x81);
     if ((type == ElementaryStreamTypes.AUDIO_STREAM_AC3) ||
         (type == ElementaryStreamTypes.AUDIO_STREAM_AC3_PLUS))
     {
         AC3Info info = new AC3Info(payload, offset);
         if (this.MlpToAc3 || (info.Valid && info.IndependentStream))
         {
             pes.Add(0x71);
             priority = true;
         }
         else
         {
             pes.Add(0x72);
             priority = false;
         }
     }
     else if (type == ElementaryStreamTypes.AUDIO_STREAM_AC3_TRUE_HD)
     {
         if (payload.Length - offset > 1 &&
             payload[offset] == (byte)(Constants.AC3_SYNC >> 8) &&
             payload[offset + 1] == (byte)(Constants.AC3_SYNC & 0xff))
         {
             pes.Add(0x76);
             priority = true;
         }
         else
         {
             pes.Add(0x72);
             priority = false;
         }
     }
     PesHeader ph = new PesHeader(pes.ToArray());
     ph.Pts = pts;
     PesPacket pp = new PesPacket(ph.Data, 0, ph.Data.Length, pid);
     pp.AddData(payload, offset, len);
     pp.Complete = true;
     MuxPesPacketToTs(pp, priority);
 }
Esempio n. 3
0
        private PesPacket CheckAndFixDiscontinuities(PesPacket pp)
        {
            // checks for PTS/DTS discontinuities
            PesHeader ph = pp.GetHeader();
            byte[] data = pp.GetData();
            int len = ph.TotalHeaderLength;
            int i = len;
            UInt32 marker = 0xffffffff;
            if (Constants.DEFAULT_VIDEO_PID == pidMappings[pp.PID])
            {
                // checks for end of stream headers
                switch (VideoType)
                {
                    case (byte)ElementaryStreamTypes.VIDEO_STREAM_VC1:
                        for (; i < data.Length; i++)
                        {
                            marker <<= 8;
                            marker |= data[i];
                            if (marker == Constants.VC1_END_OF_STREAM)
                                break;
                        }
                        if (i < data.Length)
                        {
                            // we have an end of stream marker
                            i -= 3;
                            PesPacket pnew = new PesPacket(data, 0, i, pp.PID);
                            i += 4;
                            pnew.AddData(data, i, data.Length - i);
                            pp = pnew;
                            ph = pp.GetHeader();
                            data = pp.GetData();
                        }
                        break;
                    case (byte)ElementaryStreamTypes.VIDEO_STREAM_MPEG2:
                        for (; i < data.Length; i++)
                        {
                            marker <<= 8;
                            marker |= data[i];
                            if (marker == Constants.MPEG2_SEQ_END)
                                break;
                        }
                        if (i < data.Length)
                        {
                            // we have an end of stream marker
                            i -= 3;
                            PesPacket pnew = new PesPacket(data, 0, i, pp.PID);
                            i += 4;
                            pnew.AddData(data, i, data.Length - i);
                            pp = pnew;
                            ph = pp.GetHeader();
                            data = pp.GetData();
                        }
                        break;
                    case (byte)ElementaryStreamTypes.VIDEO_STREAM_H264:
                        for (; i < data.Length; i++)
                        {
                            marker <<= 8;
                            marker |= data[i];
                            if ((marker & 0xffffff9f) == Constants.H264_END_OF_STREAM)
                                break;
                        }
                        if (i < data.Length)
                        {
                            // we have an end of stream marker
                            i -= 3;
                            PesPacket pnew = new PesPacket(data, 0, i, pp.PID);
                            i += 4;
                            pnew.AddData(data, i, data.Length - i);
                            pp = pnew;
                            ph = pp.GetHeader();
                            data = pp.GetData();
                        }
                        break;
                }

                if (ph.HasPts)
                {
                    lastPts = currentPts;
                    currentPts = ph.Pts;
                    ptsCount = ptsDelta;
                    ptsDelta = currentPts - lastPts;
                    if (lastPts != -1)
                    {
                        if (ptsDelta < (0 - (Constants.PTS_CLOCK_RATE << 2)) ||
                            ptsDelta > (Constants.PTS_CLOCK_RATE << 2))
                        {
                            ptsOffset += (lastPts + ptsCount - currentPts);
                        }
                    }
                }

                // build EP Map info
                marker = 0xffffffff;
                switch (VideoType)
                {
                    case (byte)ElementaryStreamTypes.VIDEO_STREAM_VC1:
                        for (i = ph.TotalHeaderLength; i < data.Length; i++)
                        {
                            marker <<= 8;
                            marker |= data[i];
                            if (marker == Constants.VC1_SEQ_SC && ph.HasPts)
                            {
                                EpElement ep = new EpElement(ph.Pts, this.CurrentPacketNumber);
                                epData.Add(ep);
                                break;
                            }
                        }
                        break;
                    case (byte)ElementaryStreamTypes.VIDEO_STREAM_MPEG2:
                        for (i = ph.TotalHeaderLength; i < data.Length; i++)
                        {
                            marker <<= 8;
                            marker |= data[i];
                            if (marker == Constants.MPEG2_SEQ_CODE && ph.HasPts)
                            {
                                EpElement ep = new EpElement(ph.Pts, this.CurrentPacketNumber);
                                epData.Add(ep);
                                break;
                            }
                        }
                        break;
                    case (byte)ElementaryStreamTypes.VIDEO_STREAM_H264:
                        for (i = ph.TotalHeaderLength; i < data.Length; i++)
                        {
                            marker <<= 8;
                            marker |= data[i];
                            if ((marker & 0xffffff9f) == Constants.H264_PREFIX && ph.HasPts)
                            {
                                EpElement ep = new EpElement(ph.Pts, this.CurrentPacketNumber);
                                epData.Add(ep);
                                break;
                            }
                        }
                        break;
                }

            }
            if (ph.HasPts && ptsOffset != 0)
            {
                Int64 time = ph.Pts + ptsOffset;
                if (time < 0)
                    time += Constants.MAX_PTS_CLOCK;
                else if (time > Constants.MAX_PTS_CLOCK)
                    time -= Constants.MAX_PTS_CLOCK;
                ph.Pts = time;
                for (i = 9; i < 14; i++)
                    pp[i] = ph[i]; // copy PTS
                if (ph.HasDts)
                {
                    time = ph.Dts + ptsOffset;
                    if (time < 0)
                        time += Constants.MAX_PTS_CLOCK;
                    else if (time > Constants.MAX_PTS_CLOCK)
                        time -= Constants.MAX_PTS_CLOCK;
                    ph.Dts = time;
                    for (i = 14; i < 19; i++)
                        pp[i] = ph[i]; // copy DTS
                }
            }

            lastPacket = pp;
            return pp;
        }
Esempio n. 4
0
 public override PesPacket[] GetNextPesPackets()
 {
     // there was a big optimization opportunity here:
     // this method added to partial packets one byte at a time
     // the calls to PesPacket.AddData used about 40% of total CPU
     byte[] inData = new byte[1];
     byte[] inData2 = new byte[128];
     int bytesRead = 0;
     int bytesToRead = 0;
     int bytesToGo = 0;
     UInt32 marker = 0xffffffff;
     PesPacket pp = null;
     PesPacket partial = null;
     int i = 0;
     while (tsior.Read(inData, 0, inData.Length) == inData.Length)
     {
         marker = marker << 8;
         marker &= 0xffffff00;
         marker += inData[0];
         if ((marker & 0xffffff00) == 0x00000100)
         {
             if ((marker & 0xff) == Constants.PACK_ID)
             {
                 // pack start code
                 UInt64 header = 0;
                 for (i = 4; i < 10; i++)
                 {
                     if (tsior.Read(inData, 0, inData.Length) != inData.Length)
                         goto done;
                     header <<= 8;
                     header |= inData[0];
                 }
                 for (i = 10; i < 14; i++) // skip mux rate etc.
                 {
                     if (tsior.Read(inData, 0, inData.Length) != inData.Length)
                         goto done;
                 }
                 Int64 pcr = (Int64)((header & 0x380000000000) >> 13);
                 pcr |= (Int64)((header & 0x3fff8000000) >> 12);
                 pcr |= (Int64)((header & 0x3fff800) >> 11);
                 pcr *= 300;
                 pcr |= (Int64)((header & 0x3fe) >> 1);
                 Int64 delta = pcr - lastPcr;
                 if (delta > Constants.MPEG2TS_CLOCK_RATE / 9)
                 {
                     if (pcrDelegate != null)
                         pcrDelegate(pcr);
                     lastPcr = pcr;
                 }
             }
             else if (((marker & 0xff) == Constants.SYS_ID)
                 || ((marker & 0xff) == Constants.MAP_ID)
                 || ((marker & 0xff) == Constants.PAD_ID)
                 || ((marker & 0xff) == Constants.DIR_ID))
             {
                 ushort Length = 0;
                 for (i = 4; i < 6; i++)
                 {
                     if (tsior.Read(inData, 0, inData.Length) != inData.Length)
                         goto done;
                     Length <<= 8;
                     Length |= inData[0];
                 }
                 Length += 6;
                 for (i = 6; i < Length; i++)
                 {
                     if (tsior.Read(inData, 0, inData.Length) != inData.Length)
                         goto done;
                 }
             }
             else
             {
                 byte end = inData[0];
                 inData[0] = 0;
                 partial = new PesPacket(inData, 0, 1, 0);
                 partial.AddData(inData, 0, 1);
                 inData[0] = 1;
                 partial.AddData(inData, 0, 1);
                 inData[0] = end;
                 partial.AddData(inData, 0, 1);
                 ushort Length = 0;
                 for (i = 4; i < 6; i++)
                 {
                     if (tsior.Read(inData, 0, inData.Length) != inData.Length)
                         goto done;
                     partial.AddData(inData, 0, 1);
                     Length <<= 8;
                     Length |= inData[0];
                 }
                 Length += 6;
                 // we don't need this byte-by-byte loop here, as we have just gotten the length:
                 /*
                 for (i = 6; i < Length; i++)
                 {
                     if (tsior.Read(inData, 0, inData.Length) != inData.Length)
                         goto done;
                     partial.AddData(inData, 0, 1);
                 }
                 */
                 bytesToGo = Length - 6;
                 while (bytesToGo > 0)
                 {
                     bytesToRead = (bytesToGo > inData2.Length) ? inData2.Length : bytesToGo;
                     if ((bytesRead = tsior.Read(inData2, 0, bytesToRead)) != bytesToRead)
                         goto done;
                     partial.AddData(inData2, 0, bytesRead);
                     bytesToGo -= bytesRead;
                 }
                 pp = partial;
                 PesHeader ph = partial.GetHeader();
                 if (partial.BaseId == Constants.PES_PRIVATE1)
                 {
                     if ((partial.ExtendedId & 0xf0) == Constants.PES_PRIVATE_AC3_PLUS ||
                         (partial.ExtendedId & 0xf8) == Constants.PES_PRIVATE_AC3)
                     {
                         if (soundFrames.ContainsKey(partial.ExtendedId) == false)
                             soundFrames.Add(partial.ExtendedId, new List<byte>());
                         byte[] tempd = partial.GetPayload();
                         for (int j = 4; j < tempd.Length; j++)
                             soundFrames[partial.ExtendedId].Add(tempd[j]);
                         tempd = soundFrames[partial.ExtendedId].ToArray();
                         int len = 0;
                         ushort mk2 = 0xffff;
                         if (tempd.Length > 2 && tempd[0] == (byte)(Constants.AC3_SYNC >> 8) &&
                             tempd[1] == (byte)(Constants.AC3_SYNC & 0xff))
                         {
                             pp = null;
                             while (tempd.Length > 2 && tempd[0] == (byte)(Constants.AC3_SYNC >> 8)
                                 && tempd[1] == (byte)(Constants.AC3_SYNC & 0xff))
                             {
                                 AC3Info ac3 = new AC3Info(tempd, 0);
                                 if (ac3.Valid == false || ac3.FrameLength == 0 || tempd.Length < ac3.FrameLength)
                                     break;
                                 if (pp == null)
                                     pp = new PesPacket(partial.GetData(), 0, ph.TotalHeaderLength, partial.ExtendedId);
                                 pp.AddData(tempd, 0, ac3.FrameLength);
                                 soundFrames[partial.ExtendedId].RemoveRange(0, ac3.FrameLength);
                                 tempd = soundFrames[partial.ExtendedId].ToArray();
                             }
                             if (pp != null)
                             {
                                 pp.Complete = true;
                                 goto done;
                             }
                         }
                         for (int j = 2; j < tempd.Length; j++)
                         {
                             mk2 <<= 8;
                             mk2 |= tempd[j];
                             if (mk2 == Constants.AC3_SYNC)
                             {
                                 len = j - 1;
                                 mk2 = 0xffff;
                                 break;
                             }
                         }
                         if (len == 0)
                             len = tempd.Length;
                         soundFrames[partial.ExtendedId].RemoveRange(0, len);
                         pp = new PesPacket(partial.GetData(), 0, ph.TotalHeaderLength, partial.ExtendedId);
                         pp.AddData(tempd, 0, len);
                         pp.Complete = true;
                     }
                     else if ((partial.ExtendedId & 0xf8) == Constants.PES_PRIVATE_AC3_TRUE_HD)
                     {
                         if (soundFrames.ContainsKey(partial.ExtendedId) == false)
                             soundFrames.Add(partial.ExtendedId, new List<byte>());
                         byte[] tempd = partial.GetPayload();
                         for (int j = 5; j < tempd.Length; j++)
                             soundFrames[partial.ExtendedId].Add(tempd[j]);
                         tempd = soundFrames[partial.ExtendedId].ToArray();
                         int len = tempd.Length;
                         /*
                         UInt32 mk2 = 0xffffffff;
                         for (int j = 5; j < tempd.Length; j++)
                         {
                             mk2 <<= 8;
                             mk2 |= tempd[j];
                             if (mk2 == Constants.MLP_SYNC)
                             {
                                 len = j - 3;
                                 mk2 = 0xffffffff;
                             }
                         }
                         if (len == 0)
                         {
                                 len = tempd.Length;
                         }
                         */
                         soundFrames[partial.ExtendedId].RemoveRange(0, len);
                         pp = new PesPacket(partial.GetData(), 0, ph.TotalHeaderLength, partial.ExtendedId);
                         pp.AddData(tempd, 0, len);
                         pp.Complete = true;
                     }
                     else if ((partial.ExtendedId & 0xf8) == Constants.PES_PRIVATE_LPCM)
                     {
                         if (soundFrames.ContainsKey(partial.ExtendedId) == false)
                             soundFrames.Add(partial.ExtendedId, new List<byte>());
                         byte[] tempd = partial.GetPayload();
                         for (int j = 7; j < tempd.Length; j++)
                             soundFrames[partial.ExtendedId].Add(tempd[j]);
                         tempd = soundFrames[partial.ExtendedId].ToArray();
                         int len = tempd.Length;
                         /*
                         UInt32 mk2 = 0xffffffff;
                         for (int j = 5; j < tempd.Length; j++)
                         {
                             mk2 <<= 8;
                             mk2 |= tempd[j];
                             if (mk2 == Constants.MLP_SYNC)
                             {
                                 len = j - 3;
                                 mk2 = 0xffffffff;
                             }
                         }
                         if (len == 0)
                         {
                                 len = tempd.Length;
                         }
                         */
                         soundFrames[partial.ExtendedId].RemoveRange(0, len);
                         pp = new PesPacket(partial.GetData(), 0, ph.TotalHeaderLength, partial.ExtendedId);
                         pp.AddData(tempd, 0, len);
                         pp.Complete = true;
                     }
                     else if ((partial.ExtendedId & 0xf8) == Constants.PES_PRIVATE_DTS_HD)
                     {
                         if (soundFrames.ContainsKey(partial.ExtendedId) == false)
                             soundFrames.Add(partial.ExtendedId, new List<byte>());
                         byte[] tempd = partial.GetPayload();
                         for (int j = 4; j < tempd.Length; j++)
                             soundFrames[partial.ExtendedId].Add(tempd[j]);
                         tempd = soundFrames[partial.ExtendedId].ToArray();
                         int len = 0;
                         UInt32 mk2 = 0xffffffff;
                         for (int j = 4; j < tempd.Length; j++)
                         {
                             mk2 <<= 8;
                             mk2 |= tempd[j];
                             if (mk2 == Constants.DTS_SYNC)
                             {
                                 len = j - 3;
                                 mk2 = 0xffffffff;
                             }
                         }
                         if (len == 0)
                         {
                             DtsInfo dts = new DtsInfo(tempd, 0);
                             if (dts.Valid && (int)dts.FrameSize < tempd.Length &&
                                 (tempd.Length - (int)dts.FrameSize < 4))
                                 len = (int)dts.FrameSize;
                             else
                                 len = tempd.Length;
                         }
                         soundFrames[partial.ExtendedId].RemoveRange(0, len);
                         pp = new PesPacket(partial.GetData(), 0, ph.TotalHeaderLength, partial.ExtendedId);
                         pp.AddData(tempd, 0, len);
                         pp.Complete = true;
                     }
                     else
                         pp.PID = pp.ExtendedId;
                 }
                 else if (pp.BaseId == Constants.PES_PADDING || pp.BaseId == Constants.PES_PRIVATE2)
                 {
                     marker = 0xffffffff;
                     continue;
                 }
                 else if (((pp.BaseId & 0xe0) == Constants.PES_AUDIO_MPEG)
                     || ((pp.BaseId & 0xf0) == Constants.PES_VIDEO))
                     pp.PID = pp.BaseId;
                 else if (pp.BaseId == Constants.PES_VIDEO_VC1 && ph != null)
                     pp.PID = ph.Extention2;
                 if (ph != null && ph.HasPts)
                 {
                     if (ptsDelegate != null)
                         ptsDelegate(ph.Pts, pp.PID);
                 }
                 goto done;
             }
             marker = 0xffffffff;
         }
     }
     done:
     if (null != pp)
     {
         PesPacket[] ppa = new PesPacket[1];
         ppa[0] = pp;
         return ppa;
     }
     else
         return null;
 }
Esempio n. 5
0
        public override PesPacket[] GetNextPesPackets()
        {
            byte b0 = 0;
            byte b1 = 0;
            byte[] inData = new byte[1];
            byte[] pgHeader = new byte[3];

            while (tsior.Read(inData, 0, inData.Length) == inData.Length)
            {
                b0 = b1;
                b1 = inData[0];
                if ((b0 == (byte)'P' || b0 == (byte)'p') &&
                    (b1 == (byte)'G' || b1 == (byte)'g'))
                {
                    Int64 Pts = 0;
                    Int64 Dts = 0;
                    ushort len = 0;
                    for (int k = 0; k < 4; k++)
                    {
                        if (0 == tsior.Read(inData, 0, inData.Length))
                            return null;
                        Pts <<= 8;
                        Pts |= inData[0];
                    }
                    Pts <<= 1;
                    if (ptsDelegate != null)
                        ptsDelegate(Pts, sis[0].ElementaryPID);
                    for (int k = 0; k < 4; k++)
                    {
                        if (0 == tsior.Read(inData, 0, inData.Length))
                            return null;
                        Dts <<= 8;
                        Dts |= inData[0];
                    }
                    Dts <<= 1;
                    for (int k = 0; k < 3; k++)
                    {
                        if (0 == tsior.Read(inData, 0, inData.Length))
                            return null;
                        pgHeader[k] = inData[0];
                        if (k > 0)
                        {
                            len <<= 8;
                            len |= inData[0];
                        }
                    }
                    byte hlen = (byte)(Dts == 0 ? 0x05 : 0x0a);
                    ushort plen = (ushort)(6 + hlen + len);
                    PesPacket pp = new PesPacket(PesTemplate, 0, PesTemplate.Length, sis[0].ElementaryPID);
                    inData[0] = (byte)((plen >> 8) & 0xff);
                    pp.AddData(inData, 0, 1);
                    inData[0] = (byte)(plen & 0xff);
                    pp.AddData(inData, 0, 1);
                    inData[0] = 0x81;
                    pp.AddData(inData, 0, 1);
                    inData[0] = (byte)(Dts == 0 ? 0x80 : 0xc0);
                    pp.AddData(inData, 0, 1);
                    inData[0] = hlen;
                    pp.AddData(inData, 0, 1);
                    byte old = (byte)(Dts == 0 ? 0x21 : 0x31);
                    inData[0] = (byte)(((Pts & 0x1C0000000) >> 29) | old);
                    pp.AddData(inData, 0, 1);
                    inData[0] = (byte)((Pts & 0x3fC00000) >> 22);
                    pp.AddData(inData, 0, 1);
                    inData[0] = (byte)(((Pts & 0x3f8000) >> 14) | 0x01);
                    pp.AddData(inData, 0, 1);
                    inData[0] = (byte)((Pts & 0x7f80) >> 7);
                    pp.AddData(inData, 0, 1);
                    inData[0] = (byte)(((Pts & 0x7f) << 1) | 0x01);
                    pp.AddData(inData, 0, 1);
                    if (Dts != 0)
                    {
                        inData[0] = (byte)(((Dts & 0x1C0000000) >> 29) | 0x11);
                        pp.AddData(inData, 0, 1);
                        inData[0] = (byte)((Dts & 0x3fC00000) >> 22);
                        pp.AddData(inData, 0, 1);
                        inData[0] = (byte)(((Dts & 0x3f8000) >> 14) | 0x01);
                        pp.AddData(inData, 0, 1);
                        inData[0] = (byte)((Dts & 0x7f80) >> 7);
                        pp.AddData(inData, 0, 1);
                        inData[0] = (byte)(((Dts & 0x7f) << 1) | 0x01);
                        pp.AddData(inData, 0, 1);
                    }
                    pp.AddData(pgHeader, 0, pgHeader.Length);
                    for (int k = 0; k < len; k++)
                    {
                        if (0 == tsior.Read(inData, 0, inData.Length))
                            return null;
                        pp.AddData(inData, 0, 1);
                    }
                    PesPacket[] ppa = new PesPacket[1];
                    ppa[0] = pp;
                    return ppa;
                }
            }
            return null;
        }
Esempio n. 6
0
 private PesPacket BuildVc1Pes(Int64 timestamp, byte[] data, ushort pid)
 {
     List<byte> pes = new List<byte>();
     pes.Add(0x00);
     pes.Add(0x00);
     pes.Add(0x01);
     pes.Add(Constants.PES_VIDEO_VC1);
     pes.Add(0x00);
     pes.Add(0x00);
     pes.Add(0x84);
     pes.Add(0x81);
     pes.Add(0x08);
     pes.Add(0x21);
     pes.Add(0x00);
     pes.Add(0x01);
     pes.Add(0x00);
     pes.Add(0x01);
     pes.Add(0x01);
     pes.Add(0x81);
     pes.Add(0x55);
     PesHeader ph = new PesHeader(pes.ToArray());
     ph.Pts = timestamp;
     PesPacket pp = new PesPacket(ph.Data, 0, ph.Data.Length, pid);
     pp.AddData(data, 0, data.Length);
     pp.Complete = true;
     return pp;
 }