Beispiel #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);
        }
Beispiel #2
0
        private void MuxDtsToTs(PesPacket pp, ElementaryStreamTypes type)
        {
            Int64     pts = 0;
            PesHeader ph  = pp.GetHeader();

            if (ph.HasPts == false)
            {
                if (lastPtsList.ContainsKey(pp.PID))
                {
                    pts = lastPtsList[pp.PID];
                }
            }
            else
            {
                pts = ph.Pts;
                lastPtsList[pp.PID] = pts;
            }
            byte[]  payload = pp.GetPayload();
            DtsInfo dts     = new DtsInfo(payload, 0);

            if (this.processAudio || (dts.Valid && dts.FrameSize == payload.Length))
            {
                MuxSingleDtsToTs(payload, 0, payload.Length, pts, type, pp.PID);
            }
            else
            {
                if (soundFrames.ContainsKey(pp.PID) == false)
                {
                    // skip to the good part.
                    UInt32 mk2   = 0xffffffff;
                    int    index = 0;
                    for (index = 0; index < payload.Length; index++)
                    {
                        mk2 <<= 8;
                        mk2  |= payload[index];
                        if (mk2 == Constants.DTS_SYNC)
                        {
                            break;
                        }
                    }
                    if (index == payload.Length)
                    {
                        MuxSingleDtsToTs(payload, 0, payload.Length, pts, type, pp.PID);
                    }
                    else
                    {
                        index--;
                        List <byte> framelist = new List <byte>();
                        for (; index < payload.Length; index++)
                        {
                            framelist.Add(payload[index]);
                        }
                        soundFrames.Add(pp.PID, framelist);
                    }
                }
                else
                {
                    soundFrames[pp.PID].AddRange(payload);
                }
                if (soundFrames.ContainsKey(pp.PID))
                {
                    payload = soundFrames[pp.PID].ToArray();
                    dts     = new DtsInfo(payload, 0);
                    int len = 0;
                    while (dts.Valid && dts.FrameSize > 0 && dts.FrameSize + len <= payload.Length)
                    {
                        len += dts.FrameSize;
                        dts  = new DtsInfo(payload, len);
                    }
                    if (len > 0)
                    {
                        MuxSingleDtsToTs(payload, 0, len, pts, type, pp.PID);
                        soundFrames[pp.PID].RemoveRange(0, len);
                    }
                }
            }
        }