From 6c813f596bd1632a322fb5cdc52065e21cafdabf Mon Sep 17 00:00:00 2001 From: Fey Date: Mon, 15 Dec 2025 23:04:20 +0100 Subject: [PATCH] Can now handle NIT and TOT from SIS. --- skyscraper8/DvbSis/NullSisHandler.cs | 15 ++++++++++--- skyscraper8/DvbSis/SisHandler.cs | 6 +++-- skyscraper8/DvbSis/SisPsiHandler.cs | 12 +++++++++- skyscraper8/DvbSis/SisTotContainer.cs | 22 +++++++++++++++++++ skyscraper8/Properties/launchSettings.json | 2 +- .../Skyscraper/Scraper/SkyscraperContext.cs | 5 +++++ 6 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 skyscraper8/DvbSis/SisTotContainer.cs diff --git a/skyscraper8/DvbSis/NullSisHandler.cs b/skyscraper8/DvbSis/NullSisHandler.cs index d2e85d7..ea54987 100644 --- a/skyscraper8/DvbSis/NullSisHandler.cs +++ b/skyscraper8/DvbSis/NullSisHandler.cs @@ -26,8 +26,13 @@ namespace skyscraper8.DvbSis public void OnSisFti(int relatedPid, _0xF0_FramingTimingInformation fti) { - } - + } + + public void OnSisNit(int sourcePid, SisNitContainer nitContainer) + { + + } + public void OnSisPat(int sourcePid, SisPatContainer patContainer) { } @@ -47,6 +52,10 @@ namespace skyscraper8.DvbSis public void OnSisTimestamp(int pid, _0x20_DvbT2Timestamp t2Timestamp) { - } + } + + public void OnSisTot(int sourcePid, SisTotContainer totContainer) + { + } } } diff --git a/skyscraper8/DvbSis/SisHandler.cs b/skyscraper8/DvbSis/SisHandler.cs index 3d3a0bf..f33320e 100644 --- a/skyscraper8/DvbSis/SisHandler.cs +++ b/skyscraper8/DvbSis/SisHandler.cs @@ -13,11 +13,13 @@ namespace skyscraper8.DvbSis void OnSisCat(int sourcePid, SisCatContainer catContainer); void OnSisDsaci(ushort currentDsaGroupId, int versionNumber, byte sectionNumber, byte lastSectionNumber, Stream dsaci); void OnSisEit(int sourcePid, SisEitContainer eitContainer); - void OnSisFti(int relatedPid, _0xF0_FramingTimingInformation fti); + void OnSisFti(int relatedPid, _0xF0_FramingTimingInformation fti); + void OnSisNit(int sourcePid, SisNitContainer nitContainer); void OnSisPat(int sourcePid, SisPatContainer patContainer); void OnSisPmt(int sourcePid, SisPmtContainer pmtContainer); void OnSisSdt(int sourcePid, SisSdtContainer sdtContainer); void OnSisTdt(int sourcePid, SisTdtContainer tdtContainer); - void OnSisTimestamp(int pid, _0x20_DvbT2Timestamp t2Timestamp); + void OnSisTimestamp(int pid, _0x20_DvbT2Timestamp t2Timestamp); + void OnSisTot(int sourcePid, SisTotContainer totContainer); } } diff --git a/skyscraper8/DvbSis/SisPsiHandler.cs b/skyscraper8/DvbSis/SisPsiHandler.cs index b52b195..3ee6d1b 100644 --- a/skyscraper8/DvbSis/SisPsiHandler.cs +++ b/skyscraper8/DvbSis/SisPsiHandler.cs @@ -41,7 +41,11 @@ namespace skyscraper8.DvbSis _handler.OnSisPmt(sourcePid, pmtContainer); break; case 0x40: - + SisNitContainer nitContainer = new SisNitContainer(); + NitParser nitParser = new NitParser(nitContainer); + nitParser.GatherPsi(section, 0); + _handler.OnSisNit(sourcePid, nitContainer); + break; case 0x42: SisSdtContainer sdtContainer = new SisSdtContainer(); SdtParser sdtParser = new SdtParser(sdtContainer); @@ -60,6 +64,12 @@ namespace skyscraper8.DvbSis TimetableParser tdtParser = new TimetableParser(tdtContainer, null); tdtParser.GatherPsi(section, sourcePid); _handler.OnSisTdt(sourcePid, tdtContainer); + break; + case 0x73: + SisTotContainer totContainer = new SisTotContainer(); + TimetableParser totParser = new TimetableParser(null, totContainer); + totParser.GatherPsi(section, sourcePid); + _handler.OnSisTot(sourcePid, totContainer); break; default: throw new NotImplementedException(String.Format("Table ID 0x{0:X2} in DVB-SIS PSI/SI not supported yet. To get this fixed, please share a sample of this stream.", section.TableId)); diff --git a/skyscraper8/DvbSis/SisTotContainer.cs b/skyscraper8/DvbSis/SisTotContainer.cs new file mode 100644 index 0000000..b6eea9a --- /dev/null +++ b/skyscraper8/DvbSis/SisTotContainer.cs @@ -0,0 +1,22 @@ +using skyscraper5.Dvb.Descriptors; +using skyscraper5.Dvb.Psi; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace skyscraper8.DvbSis +{ + internal class SisTotContainer : ITotEventHandler + { + public DateTime UtcTime { get; private set; } + public LocalTimeOffsetDescriptor LocalTimeOffset { get; private set; } + + public void OnTotTime(DateTime utcTime, LocalTimeOffsetDescriptor ltod) + { + this.UtcTime = utcTime; + this.LocalTimeOffset = ltod; + } + } +} diff --git a/skyscraper8/Properties/launchSettings.json b/skyscraper8/Properties/launchSettings.json index f8cec80..c3ff4ae 100644 --- a/skyscraper8/Properties/launchSettings.json +++ b/skyscraper8/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "skyscraper8": { "commandName": "Project", - "commandLineArgs": "\"F:\\utena2\\dvb-sis_eutelsat5_12522_v.ts\"", + "commandLineArgs": "\"F:\\utena2\\dvb-sis_badr_12563v.ts\"", "remoteDebugEnabled": false }, "Container (Dockerfile)": { diff --git a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs index 28ccdae..671d4e2 100644 --- a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs +++ b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs @@ -590,6 +590,11 @@ namespace skyscraper5.Skyscraper.Scraper DvbContext.RegisterPacketProcessor(mappingStream.ElementaryPid, videoPacketProcessor); } + if (!DvbContext.IsPidProcessorPresent(mappingStream.ElementaryPid)) + { + DvbContext.RegisterPacketProcessor(mappingStream.ElementaryPid, new PacketDiscarder()); + } + break; case StreamType.Teletext: if (!CurrentNetworkId.HasValue)