private void CreatePsi() { pidMappings = new Dictionary<ushort, ushort>(); Continuities = new Dictionary<ushort, byte>(); ushort currentVideoPid = Constants.DEFAULT_VIDEO_PID; ushort currentAudioPid = Constants.DEFAULT_AUDIO_PID; ushort currentSubPid = Constants.DEFAULT_SUBTITLE_PID; ushort currentPresPid = Constants.DEFAULT_PRESENTATION_GRAPHICS_PID; ushort currentIntPid = Constants.DEFAULT_INTERACTIVE_GRAPHICS_PID; pmtStreams = new List<StreamInfo>(); StreamInfo sitemp = null; foreach (StreamInfo si in StreamsToKeep) { if (pidMappings.ContainsKey(si.ElementaryPID)) throw new ArgumentException(String.Format("Invalid/Duplicate StreamInfo with pid {0}", si.ElementaryPID)); switch (si.StreamType) { case ElementaryStreamTypes.AUDIO_STREAM_AC3: case ElementaryStreamTypes.AUDIO_STREAM_AC3_PLUS: pidMappings.Add(si.ElementaryPID, currentAudioPid); if(this.fileType == TsFileType.BLU_RAY) sitemp = new StreamInfo(si.StreamType, currentAudioPid); else sitemp = new StreamInfo(ElementaryStreamTypes.AUDIO_STREAM_AC3, currentAudioPid); Continuities.Add(currentAudioPid, 0); currentAudioPid++; break; case ElementaryStreamTypes.AUDIO_STREAM_AC3_TRUE_HD: pidMappings.Add(si.ElementaryPID, currentAudioPid); if(MlpToAc3) sitemp = new StreamInfo(ElementaryStreamTypes.AUDIO_STREAM_AC3, currentAudioPid); else sitemp = new StreamInfo(ElementaryStreamTypes.AUDIO_STREAM_AC3_TRUE_HD, currentAudioPid); Continuities.Add(currentAudioPid, 0); currentAudioPid++; break; case ElementaryStreamTypes.AUDIO_STREAM_DTS_HD: case ElementaryStreamTypes.AUDIO_STREAM_DTS_HD_MASTER_AUDIO: pidMappings.Add(si.ElementaryPID, currentAudioPid); if (MlpToAc3) sitemp = new StreamInfo(ElementaryStreamTypes.AUDIO_STREAM_DTS, currentAudioPid); else sitemp = new StreamInfo(si.StreamType, currentAudioPid); Continuities.Add(currentAudioPid, 0); currentAudioPid++; break; case ElementaryStreamTypes.AUDIO_STREAM_DTS: case ElementaryStreamTypes.AUDIO_STREAM_LPCM: case ElementaryStreamTypes.AUDIO_STREAM_MPEG1: case ElementaryStreamTypes.AUDIO_STREAM_MPEG2: pidMappings.Add(si.ElementaryPID, currentAudioPid); sitemp = new StreamInfo(si.StreamType, currentAudioPid); Continuities.Add(currentAudioPid, 0); currentAudioPid++; break; case ElementaryStreamTypes.SUBTITLE_STREAM: pidMappings.Add(si.ElementaryPID, currentSubPid); sitemp = new StreamInfo(si.StreamType, currentSubPid); Continuities.Add(currentSubPid, 0); currentSubPid++; break; case ElementaryStreamTypes.PRESENTATION_GRAPHICS_STREAM: pidMappings.Add(si.ElementaryPID, currentPresPid); sitemp = new StreamInfo(si.StreamType, currentPresPid); Continuities.Add(currentPresPid, 0); currentPresPid++; break; case ElementaryStreamTypes.INTERACTIVE_GRAPHICS_STREAM: pidMappings.Add(si.ElementaryPID, currentIntPid); sitemp = new StreamInfo(si.StreamType, currentIntPid); Continuities.Add(currentIntPid, 0); currentIntPid++; break; case ElementaryStreamTypes.VIDEO_STREAM_H264: case ElementaryStreamTypes.VIDEO_STREAM_MPEG1: case ElementaryStreamTypes.VIDEO_STREAM_MPEG2: case ElementaryStreamTypes.VIDEO_STREAM_VC1: pidMappings.Add(si.ElementaryPID, currentVideoPid); sitemp = new StreamInfo(si.StreamType, currentVideoPid); Continuities.Add(currentVideoPid, 0); currentVideoPid++; if (0 == VideoType) VideoType = (byte)si.StreamType; break; } sitemp.ElementaryDescriptors = si.ElementaryDescriptors; sitemp.AspectRatio = si.AspectRatio; sitemp.AudioPresentationType = si.AudioPresentationType; sitemp.FrameRate = si.FrameRate; sitemp.SamplingFrequency = si.SamplingFrequency; sitemp.VideoFormat = si.VideoFormat; pmtStreams.Add(sitemp); } pat = new PatPacket(); ProgramInfo[] pi = new ProgramInfo[2]; pi[0] = new ProgramInfo(0, Constants.SIT_PID); pi[1] = new ProgramInfo(1, Constants.DEFAULT_PMT_PID); pat.Programs = pi; pmt = new PmtPacket(); pmt.PID = Constants.DEFAULT_PMT_PID; pmt.ElementaryStreams = pmtStreams.ToArray(); List<byte> programDescriptors = new List<byte>(); programDescriptors.AddRange(Constants.copy_control_descriptor); programDescriptors.AddRange(Constants.hdmv_registration_descriptor); pmt.ProgramDescriptorsData = programDescriptors.ToArray(); sit = new SitPacket(); buffer.Add(pat); pat.IncrementContinuityCounter(); buffer.Add(pmt); pmt.IncrementContinuityCounter(); buffer.Add(sit); sit.IncrementContinuityCounter(); }
protected override void GetInitialValues() { GetTimestamps(); Seek(-1); PatPacket pp = null; PmtPacket pm = null; bool bluray = false; bool validPmt = false; ushort pmtPid = 0; int i = 0; Dictionary<ushort, StreamInfo> streams = new Dictionary<ushort, StreamInfo>(); while (true) { for (i = tsior.Read(tsPack, 0, 1 + stride); (i > 0) && (tsPack[stride] != Constants.SYNC_BYTE); i = tsior.Read(tsPack, stride, 1)) ; // ensure a good sync byte if (i == 0) break; // end of stream i = tsior.Read(tsPack, stride + 1, tsPack.Length - (stride + 1)); if (i < tsPack.Length - (stride + 1)) break; // end of stream ts.SetData(tsPack, stride); if (ts.PID == Constants.PAT_PID) { pp = new PatPacket(ts.GetData()); ProgramInfo[] pi = pp.Programs; if (null != pi && pi.Length == 2) { if ((pi[0].ProgramNumber == 0 && pi[0].ProgramPID == 0x001f && pi[1].ProgramNumber == 1 && pi[1].ProgramPID == 0x0100) || (pi[1].ProgramNumber == 0 && pi[1].ProgramPID == 0x001f && pi[0].ProgramNumber == 1 && pi[0].ProgramPID == 0x0100)) { bluray = true; } } else if (null != pi && pi[0] != null && pi[0].ProgramNumber == 1) pmtPid = pi[0].ProgramPID; } else if (bluray && ts.PID == 0x0100) { if (pm == null) pm = new PmtPacket(ts.GetData()); else if (pm.Complete == false) pm.AddData(ts.Payload, 0, ts.Payload.Length); if (pm.Complete) { sis = pm.ElementaryStreams; dt = pm.DtcpInfo; return; } } else if (ts.PID == pmtPid) { pm = new PmtPacket(ts.GetData()); sis = pm.ElementaryStreams; dt = pm.DtcpInfo; } else if (streams.ContainsKey(ts.PID) == false && ts.HasPesHeader) { byte[] payload = ts.Payload; PesHeader ph = new PesHeader(ts.Payload); PesPacket pes = new PesPacket(payload, 0, payload.Length, ts.PID); if (ph.StreamId == Constants.PES_PRIVATE1) { byte[] audio = pes.GetPayload(); AC3Info ac3 = new AC3Info(audio, 0); DtsInfo dts = new DtsInfo(audio, 0); MlpInfo mlp = new MlpInfo(audio, 0); if (ac3.Valid) { if (ac3.SyntaxType == Ac3SyntaxType.Standard || ac3.SyntaxType == Ac3SyntaxType.Alternative) { StreamInfo si = new StreamInfo(ElementaryStreamTypes.AUDIO_STREAM_AC3, ts.PID); streams.Add(ts.PID, si); } else if (ac3.SyntaxType == Ac3SyntaxType.Enhanced) { StreamInfo si = new StreamInfo(ElementaryStreamTypes.AUDIO_STREAM_AC3_PLUS, ts.PID); streams.Add(ts.PID, si); } } else if (dts.Valid) { StreamInfo si = new StreamInfo(ElementaryStreamTypes.AUDIO_STREAM_DTS_HD, ts.PID); streams.Add(ts.PID, si); } else if (mlp.Valid) { StreamInfo si = new StreamInfo(ElementaryStreamTypes.AUDIO_STREAM_AC3_TRUE_HD, ts.PID); streams.Add(ts.PID, si); } else if ((pes.ExtendedId & 0xf8) == Constants.PES_PRIVATE_LPCM) { StreamInfo si = new StreamInfo(ElementaryStreamTypes.AUDIO_STREAM_LPCM, ts.PID); streams.Add(ts.PID, si); } } else if ((ph.StreamId & 0xe0) == Constants.PES_AUDIO_MPEG) { StreamInfo si = new StreamInfo(ElementaryStreamTypes.AUDIO_STREAM_MPEG2, ts.PID); streams.Add(ts.PID, si); } else if ((ph.StreamId & 0xf0) == Constants.PES_VIDEO) { UInt32 format = pes.ExtendedType; if ((format & 0xffff) == 0x1) { } else if ((format & 0xffffff00) == 0x100) { } H264Info h264 = new H264Info(payload, 0); Mpeg2Info mpg2 = new Mpeg2Info(payload, 0); if (h264.Valid) { StreamInfo si = new StreamInfo(ElementaryStreamTypes.VIDEO_STREAM_H264, ts.PID); streams.Add(ts.PID, si); } else if (mpg2.Valid) { StreamInfo si = new StreamInfo(ElementaryStreamTypes.VIDEO_STREAM_MPEG2, ts.PID); streams.Add(ts.PID, si); } } else if (ph.StreamId == Constants.PES_VIDEO_VC1) { StreamInfo si = new StreamInfo(ElementaryStreamTypes.VIDEO_STREAM_VC1, ts.PID); streams.Add(ts.PID, si); } } if (sis != null) { validPmt = true; foreach (StreamInfo si in sis) { if (streams.ContainsKey(si.ElementaryPID) == false) { validPmt = false; break; } } if (validPmt) return; } if (fs.Position > (Constants.DISK_BUFFER << 1)) break; } sis = new StreamInfo[streams.Values.Count]; streams.Values.CopyTo(sis, 0); }