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); }
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; } } }
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 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); }
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); }
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); } } } }
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); } } } }
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 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); }
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); } } } }
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); } } } }
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(); }
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(); }
public StreamInfo(ElementaryStreamTypes streamType, ushort elementaryPid) { mData = new byte[5]; StreamType = streamType; ElementaryPID = elementaryPid; // reserved and descriptors length mData[3] = 0xf0; mData[4] = 0x00; }