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); }
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); }
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); }
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); }