示例#1
0
        private void MuxMlpToTs(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();

            /*
             * int index = 0;
             * int len = 0;
             * len = payload.Length - index;
             */
            MuxSingleAc3ToTs(payload, 0, payload.Length, pts, type, pp.PID);
        }
示例#2
0
        private void MuxTsPacket(PesPacket pp)
        {
            if (pidMappings.ContainsKey(pp.PID))
            {
                pp = CheckAndFixDiscontinuities(pp);
                ElementaryStreamTypes type = GetStreamType(pidMappings[pp.PID]);
                switch (type)
                {
                case ElementaryStreamTypes.AUDIO_STREAM_AC3:
                case ElementaryStreamTypes.AUDIO_STREAM_AC3_PLUS:
                    if (MlpToAc3 == false || pp.Priority)
                    {
                        MuxAc3ToTs(pp, type);
                    }
                    break;

                case ElementaryStreamTypes.AUDIO_STREAM_AC3_TRUE_HD:
                    MuxMlpToTs(pp, type);
                    break;

                case ElementaryStreamTypes.AUDIO_STREAM_DTS:
                case ElementaryStreamTypes.AUDIO_STREAM_DTS_HD:
                case ElementaryStreamTypes.AUDIO_STREAM_DTS_HD_MASTER_AUDIO:
                    if (MlpToAc3 = false || pp.Priority)
                    {
                        MuxDtsToTs(pp, type);
                    }
                    break;

                case ElementaryStreamTypes.AUDIO_STREAM_LPCM:
                case ElementaryStreamTypes.AUDIO_STREAM_MPEG1:
                case ElementaryStreamTypes.AUDIO_STREAM_MPEG2:
                    MuxPesPacketToTs(pp, true);
                    break;

                default:
                    MuxPesPacketToTs(pp, pp.Priority);
                    break;
                }
            }
        }
示例#3
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);
 }
示例#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);
 }
示例#5
0
 private void MuxMlpToTs(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();
     /*
     int index = 0;
     int len = 0;
     len = payload.Length - index;
     */
     MuxSingleAc3ToTs(payload, 0, payload.Length, pts, type, pp.PID);
 }
示例#6
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);
             }
         }
     }
 }
示例#7
0
 private void MuxAc3ToTs(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();
     AC3Info ac3 = new AC3Info(payload, 0);
     if (this.processAudio || (ac3.Valid && ac3.FrameLength == payload.Length))
         MuxSingleAc3ToTs(payload, 0, payload.Length, pts, type, pp.PID);
     else
     {
         if (soundFrames.ContainsKey(pp.PID) == false)
         {
             // skip to the good part.
             ushort mk2 = 0xffff;
             int index = 0;
             for (index = 0; index < payload.Length; index++)
             {
                 mk2 <<= 8;
                 mk2 |= payload[index];
                 if (mk2 == Constants.AC3_SYNC)
                     break;
             }
             if (index == payload.Length)
                 MuxSingleAc3ToTs(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();
             ac3 = new AC3Info(payload, 0);
             int len = 0;
             if (payload.Length > ac3.MaxFrameLength)
             {
                 // resync ac3
                 ushort mk2 = 0xffff;
                 int index = 0;
                 for (index = 2; index < payload.Length; index++)
                 {
                     mk2 <<= 8;
                     mk2 |= payload[index];
                     if (mk2 == Constants.AC3_SYNC)
                     {
                         ac3 = new AC3Info(payload, index - 1);
                         if (ac3.Valid && ac3.FrameLength > 0)
                             break;
                     }
                 }
                 if (index == payload.Length)
                     len = payload.Length;
                 else
                 {
                     index -= 1;
                     len = index;
                     ac3 = new AC3Info(payload, len);
                     while (ac3.Valid && ac3.FrameLength > 0 && ac3.FrameLength + len <= payload.Length)
                     {
                         len += ac3.FrameLength;
                         ac3 = new AC3Info(payload, len);
                     }
                 }
             }
             else while (ac3.Valid && ac3.FrameLength > 0 && ac3.FrameLength + len <= payload.Length)
             {
                 len += ac3.FrameLength;
                 ac3 = new AC3Info(payload, len);
             }
             if (len > 0)
             {
                 MuxSingleAc3ToTs(payload, 0, len, pts, type, pp.PID);
                 soundFrames[pp.PID].RemoveRange(0, len);
             }
         }
     }
 }
示例#8
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);
        }
示例#9
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);
        }
示例#10
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);
                    }
                }
            }
        }
示例#11
0
        private void MuxAc3ToTs(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();
            AC3Info ac3     = new AC3Info(payload, 0);

            if (this.processAudio || (ac3.Valid && ac3.FrameLength == payload.Length))
            {
                MuxSingleAc3ToTs(payload, 0, payload.Length, pts, type, pp.PID);
            }
            else
            {
                if (soundFrames.ContainsKey(pp.PID) == false)
                {
                    // skip to the good part.
                    ushort mk2   = 0xffff;
                    int    index = 0;
                    for (index = 0; index < payload.Length; index++)
                    {
                        mk2 <<= 8;
                        mk2  |= payload[index];
                        if (mk2 == Constants.AC3_SYNC)
                        {
                            break;
                        }
                    }
                    if (index == payload.Length)
                    {
                        MuxSingleAc3ToTs(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();
                    ac3     = new AC3Info(payload, 0);
                    int len = 0;
                    if (payload.Length > ac3.MaxFrameLength)
                    {
                        // resync ac3
                        ushort mk2   = 0xffff;
                        int    index = 0;
                        for (index = 2; index < payload.Length; index++)
                        {
                            mk2 <<= 8;
                            mk2  |= payload[index];
                            if (mk2 == Constants.AC3_SYNC)
                            {
                                ac3 = new AC3Info(payload, index - 1);
                                if (ac3.Valid && ac3.FrameLength > 0)
                                {
                                    break;
                                }
                            }
                        }
                        if (index == payload.Length)
                        {
                            len = payload.Length;
                        }
                        else
                        {
                            index -= 1;
                            len    = index;
                            ac3    = new AC3Info(payload, len);
                            while (ac3.Valid && ac3.FrameLength > 0 && ac3.FrameLength + len <= payload.Length)
                            {
                                len += ac3.FrameLength;
                                ac3  = new AC3Info(payload, len);
                            }
                        }
                    }
                    else
                    {
                        while (ac3.Valid && ac3.FrameLength > 0 && ac3.FrameLength + len <= payload.Length)
                        {
                            len += ac3.FrameLength;
                            ac3  = new AC3Info(payload, len);
                        }
                    }
                    if (len > 0)
                    {
                        MuxSingleAc3ToTs(payload, 0, len, pts, type, pp.PID);
                        soundFrames[pp.PID].RemoveRange(0, len);
                    }
                }
            }
        }
示例#12
0
 byte[] BuildVideoStreamCodingInfo(ElementaryStreamTypes type, VideoFormat format, FrameRate rate, AspectRatio ratio)
 {
     List<byte> info = new List<byte>();
     info.Add(0x15);
     info.Add((byte)type);
     info.Add((byte)((((byte)format) << 4) | (byte)rate));
     info.Add((byte)(((byte)(ratio)) << 4));
     for(int i = 0; i < 18; i++)
         info.Add(0x00);
     return info.ToArray();
 }
示例#13
0
 byte[] BuildAudioStreamCodingInfo(ElementaryStreamTypes type, AudioPresentationType format, SamplingFrequency rate)
 {
     List<byte> info = new List<byte>();
     info.Add(0x15);
     info.Add((byte)type);
     info.Add((byte)((((byte)format) << 4) | (byte)rate));
     info.Add(0x65);
     info.Add(0x6e);
     info.Add(0x67);
     for (int i = 0; i < 16; i++)
         info.Add(0x00);
     return info.ToArray();
 }
示例#14
0
 public StreamInfo(ElementaryStreamTypes streamType, ushort elementaryPid)
 {
     mData = new byte[5];
     StreamType = streamType;
     ElementaryPID = elementaryPid;
     // reserved and descriptors length
     mData[3] = 0xf0;
     mData[4] = 0x00;
 }