/// <summary> /// Bearbeitet TS-Packets für PAT, CAT, SDT, PMT, ECM und EMM /// </summary> /// <param name="tsPacket"></param> private void ProcessTsPacket(IntPtr tsPacket, int pid) { if (pid == 0x0000) // PAT { if (_TmpPat != null && _TmpPat.AddPacket(tsPacket)) { _Pat = _TmpPat; _TmpPat = null; int pmtPid = _Pat.GetPmtPidBySid(_ServiceId); if (_TransportStreamId != -1 && _TransportStreamId != 0xffff && _Pat.TransportStreamId != _TransportStreamId) { LogProvider.Add(DebugLevel.Warning, cLogSection, Message.AdapterWrongPat, _Pat.TransportStreamId, _TransportStreamId); } if (pmtPid == -1) { LogProvider.Add(DebugLevel.Warning, cLogSection, Message.AdapterServiceNotFound, _Pat.TransportStreamId, _ServiceId); _TmpPat = new PatSection(); } else if (_PmtPid != pmtPid) // PmtPid beim Tune Falsch { LogProvider.Add(DebugLevel.Info, cLogSection, Message.AdapterRetuneOnPat); Tune(_ServiceId, pmtPid, _TransportStreamId, _NetworkId); // Retune mit richtigen Daten. } else { LogProvider.Add(DebugLevel.Info, cLogSection, Message.AdapterPatDone); DelPid(0); } } } else if (pid == 0x0011) // SDT { if (_TmpSdt != null && _TmpSdt.AddPacket(tsPacket)) { _Sdt = _TmpSdt; _TmpSdt = null; if (_TransportStreamId != -1 && _TransportStreamId != 0xffff) { if (_Sdt.TransportStreamId != _TransportStreamId) { LogProvider.Add(DebugLevel.Warning, cLogSection, Message.AdapterWrongSdt, _Sdt.TransportStreamId, _TransportStreamId); _TmpSdt = new SdtSection(true); } else if (_NetworkId != _Sdt.OriginalNetworkId) { LogProvider.Add(DebugLevel.Info, cLogSection, Message.AdapterRetuneOnSdt); Tune(_ServiceId, _PmtPid, _TransportStreamId, _Sdt.OriginalNetworkId); // Retune mit richtigen Daten. } else { LogProvider.Add(DebugLevel.Info, cLogSection, Message.AdapterSdtDone); DelPid(0x0011); } } else { LogProvider.Add(DebugLevel.Warning, cLogSection, Message.AdapterSdtDoneNoTsId); } } } else if (pid == _PmtPid) { if (_TmpPmt != null && _TmpPmt.AddPacket(tsPacket)) { if (_TmpPmt.ServiceId != _ServiceId) { LogProvider.Add(DebugLevel.Warning, cLogSection, Message.AdapterWrongPmt, _TmpPmt.ServiceId); if (_Pmt != null) { LogProvider.Add(DebugLevel.Warning, cLogSection, Message.AdapterStopPmtTracking); DelPid(_PmtPid); _TmpPmt = null; } } else { if (_AdapterIndex != -1 && (_Pmt == null || (_Pmt != null && _Pmt.Version != _TmpPmt.Version))) // dann pipe verbunden. { IcPmt(_TmpPmt); LogProvider.Add(DebugLevel.Info, cLogSection, Message.AdapterPmtDone, _PmtPid, _ServiceId, _TmpPmt.Version); if (_Pmt != null) { LogProvider.Add(DebugLevel.Info, cLogSection, Message.AdapterPmtVer, _Pmt.Version); } } _Pmt = _TmpPmt; _TmpPmt = new PmtSection(_PmtPid); } } } // Filter durchlaufen, und checken ob hier was bei ist, was an oscam geht. lock (_Filters) { foreach (DemuxFilter f in _Filters) { if (f.Pid == pid && f.AddPacket(tsPacket)) { byte[][] filtered = f.GetFilteredSections(); foreach (byte[] data in filtered) { IcFilterData(f.Number, data, data.Length); LogProvider.Add(DebugLevel.Info, cLogSection, Message.AdapterDataFiltered, f.Number, f.Pid); LogProvider.Add(DebugLevel.Info | DebugLevel.HexDump, cLogSection, Message.Empty, data, 0, data.Length < 18 ? data.Length : 18); } f.Reset(); } } } }
public void Tune(int sid, int pmt, int tsId, int nId) { if (sid == -1) { if (_ServiceId == -1) // dann bereits untuned. { return; } LogProvider.Add(DebugLevel.Info, cLogSection, Message.AdapterEvUntune); lock (_Filters) _Filters.Clear(); DelAllPids(); IcStop(); _Pmt = null; _Pat = null; _Sdt = null; _TmpPmt = null; _TmpPat = null; _TmpSdt = null; try { if (_DumpFileStream != null) { lock (_DumpFileStream) { _DumpFileStream.Close(); _DumpFileStream = null; } } } catch (Exception ex) { LogProvider.Exception(cLogSection, Message.AdapterDumpStopFailed, ex); } //Pids zurücksetzen: ClearDescramblers(); } else { if (_ServiceId != -1 || _PmtPid != -1) // dann fehlte wohl untune/disable tuner { Tune(-1, -1, -1, -1); // reset. } LogProvider.Add(DebugLevel.Info, cLogSection, Message.AdapterEvTune, sid, pmt, tsId, nId); try { if (_DumpStream) { string filename = DateTime.Now.ToString("yyyyMMddHHmmss"); filename = $"tsdump-{_AdapterIndex}-{filename}-{sid}-{tsId}.ts"; filename = Path.Combine(Globals.HomeDirectory.FullName, filename); _DumpFileStream = new FileStream(filename, FileMode.Create); } } catch (Exception ex) { LogProvider.Exception(cLogSection, Message.AdapterDumpStartFailed, ex); } _TmpPat = new PatSection(); AddPid(0x0000); // PAT holen um PMT Pid zu bestimmen über sid falls PMT fehlt oder falsch. if (pmt > 0) { _TmpPmt = new PmtSection(pmt); AddPid(pmt); } if (nId < 0) { _TmpSdt = new SdtSection(true); AddPid(0x0011); } } _ServiceId = sid; _PmtPid = pmt; _TransportStreamId = tsId; _NetworkId = nId; }