Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
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);
        }
Ejemplo 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);
        }
Ejemplo n.º 4
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);
        }