private void Setup(TsDecoder.TransportStream.TsDecoder tsDecoder) { if (tsDecoder == null || _currentTeletextDescriptor != null) return; lock (tsDecoder) { if (ProgramNumber == 0) { var pmt = tsDecoder.GetSelectedPmt(ProgramNumber); if (pmt != null) { ProgramNumber = pmt.ProgramNumber; } } if (ProgramNumber == 0) return; var esStream = tsDecoder.GetEsStreamForProgramNumberByTag(ProgramNumber, 0x6, 0x56); _currentTeletextDescriptor = tsDecoder.GetDescriptorForProgramNumberByTag<TeletextDescriptor>(ProgramNumber, 6, 0x56); if (_currentTeletextDescriptor == null) return; foreach (var lang in _currentTeletextDescriptor.Languages) { // if (lang.TeletextType != 0x02 && lang.TeletextType != 0x05) // continue; TeletextPid = esStream.ElementaryPid; if (_teletextSubtitlePage == null) { _teletextSubtitlePage = new Dictionary<ushort, TeleText>(); } var m = lang.TeletextMagazineNumber; if (lang.TeletextMagazineNumber == 0) { m = 8; } var page = (ushort)((m << 8) + lang.TeletextPageNumber); if (_teletextSubtitlePage.ContainsKey(page)) continue; _teletextSubtitlePage.Add(page, new TeleText(page, TeletextPid)); _teletextSubtitlePage[page].TeletextPageRecieved += TeleTextDecoder_TeletextPageRecieved; } } }
public void AddPacket(TsDecoder.TransportStream.TsDecoder tsDecoder, TsPacket tsPacket) { if (_currentTeletextDescriptor == null) { Setup(tsDecoder); if (_currentTeletextDescriptor != null) { Debug.WriteLine($"Locked onto teletext PID for {TeletextPid} "); } } if (tsPacket.Pid != TeletextPid) return; if (tsPacket.PayloadUnitStartIndicator) { if (_currentTeletextPes != null) { if (_currentTeletextPes.HasAllBytes()) { _currentTeletextPes.Decode(); foreach (var key in _teletextSubtitlePage.Keys) { _teletextSubtitlePage[key].DecodeTeletextData(_currentTeletextPes); } } } _currentTeletextPes = new Pes(tsPacket); } else { _currentTeletextPes?.Add(tsPacket); } }