diff --git a/skyscraper8/DvbSis/FtiHandler.cs b/skyscraper8/DvbSis/FtiHandler.cs index 2141554..98bb8b5 100644 --- a/skyscraper8/DvbSis/FtiHandler.cs +++ b/skyscraper8/DvbSis/FtiHandler.cs @@ -35,7 +35,6 @@ namespace skyscraper8.DvbSis public void OnT2MiPacketLoss(int pid, byte expectedPacket, T2MIHeader header) { - throw new NotImplementedException(); } public void OnT2MiPacket(int pid, byte basebandFramePlpId, byte[] basebandPacket) diff --git a/skyscraper8/DvbSis/NullSisHandler.cs b/skyscraper8/DvbSis/NullSisHandler.cs index 608e7b5..d2e85d7 100644 --- a/skyscraper8/DvbSis/NullSisHandler.cs +++ b/skyscraper8/DvbSis/NullSisHandler.cs @@ -9,7 +9,11 @@ using System.Threading.Tasks; namespace skyscraper8.DvbSis { internal class NullSisHandler : SisHandler - { + { + public void OnSisCat(int sourcePid, SisCatContainer catContainer) + { + } + public void OnSisDsaci(ushort currentDsaGroupId, int versionNumber, byte sectionNumber, byte lastSectionNumber, Stream dsaci) { @@ -26,8 +30,21 @@ namespace skyscraper8.DvbSis public void OnSisPat(int sourcePid, SisPatContainer patContainer) { - } - + } + + public void OnSisPmt(int sourcePid, SisPmtContainer pmtContainer) + { + } + + public void OnSisSdt(int sourcePid, SisSdtContainer sdtContainer) + { + } + + public void OnSisTdt(int sourcePid, SisTdtContainer tdtContainer) + { + + } + public void OnSisTimestamp(int pid, _0x20_DvbT2Timestamp t2Timestamp) { } diff --git a/skyscraper8/DvbSis/SisCatContainer.cs b/skyscraper8/DvbSis/SisCatContainer.cs new file mode 100644 index 0000000..d0976c3 --- /dev/null +++ b/skyscraper8/DvbSis/SisCatContainer.cs @@ -0,0 +1,34 @@ +using skyscraper5.Mpeg2.Descriptors; +using skyscraper5.Mpeg2.Psi; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace skyscraper8.DvbSis +{ + internal class SisCatContainer : ICatEventHandler + { + public void NotifyOfCaSystem(CaDescriptor caDescriptor, bool fromPmt = false) + { + if (caDescriptors == null) + caDescriptors = new List(); + + caDescriptors.Add(caDescriptor); + } + + private List caDescriptors; + + public IReadOnlyList CaDescriptors + { + get + { + if (caDescriptors == null) + return new List().AsReadOnly(); + + return caDescriptors.AsReadOnly(); + } + } + } +} diff --git a/skyscraper8/DvbSis/SisHandler.cs b/skyscraper8/DvbSis/SisHandler.cs index 8ed8864..3d3a0bf 100644 --- a/skyscraper8/DvbSis/SisHandler.cs +++ b/skyscraper8/DvbSis/SisHandler.cs @@ -9,11 +9,15 @@ using System.Threading.Tasks; namespace skyscraper8.DvbSis { internal interface SisHandler - { + { + 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 OnSisPat(int sourcePid, SisPatContainer patContainer); + 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); } } diff --git a/skyscraper8/DvbSis/SisNitContainer.cs b/skyscraper8/DvbSis/SisNitContainer.cs new file mode 100644 index 0000000..707b59e --- /dev/null +++ b/skyscraper8/DvbSis/SisNitContainer.cs @@ -0,0 +1,47 @@ +using skyscraper5.Dvb.Psi; +using skyscraper5.Dvb.Psi.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace skyscraper8.DvbSis +{ + internal class SisNitContainer : INitEventHandler + { + public void OnNitNetwork(NitNetwork nitNetwork) + { + Network = nitNetwork; + } + + public void OnNitTransportStream(ushort networkId, NitTransportStream transportStream) + { + if (_transportStreams == null) + _transportStreams = new List>(); + + _transportStreams.Add(new Tuple (networkId, transportStream )); + } + + public void SetNetworkId(ushort networkId, bool forceOverrite = false) + { + this.NetworkId = networkId; + } + + public ushort? NetworkId { get; private set; } + public NitNetwork Network { get; private set; } + + private List> _transportStreams; + + public IReadOnlyList> TransportStreams + { + get + { + if (_transportStreams == null) + return new List>().AsReadOnly(); + + return _transportStreams.AsReadOnly(); + } + } + } +} diff --git a/skyscraper8/DvbSis/SisPmtContainer.cs b/skyscraper8/DvbSis/SisPmtContainer.cs new file mode 100644 index 0000000..33b0f6b --- /dev/null +++ b/skyscraper8/DvbSis/SisPmtContainer.cs @@ -0,0 +1,20 @@ +using skyscraper5.Mpeg2.Psi; +using skyscraper5.Mpeg2.Psi.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace skyscraper8.DvbSis +{ + internal class SisPmtContainer : IPmtEventHandler + { + public void PmtEvent(ProgramMapping result, int pmtPid) + { + this.ProgramMapping = result; + } + + public ProgramMapping ProgramMapping { get; private set; } + } +} diff --git a/skyscraper8/DvbSis/SisPsiHandler.cs b/skyscraper8/DvbSis/SisPsiHandler.cs index 2627d14..b52b195 100644 --- a/skyscraper8/DvbSis/SisPsiHandler.cs +++ b/skyscraper8/DvbSis/SisPsiHandler.cs @@ -27,12 +27,39 @@ namespace skyscraper8.DvbSis PatParser patParser = new PatParser(patContainer); patParser.GatherPsi(section, 0); _handler.OnSisPat(sourcePid, patContainer); - break; + break; + case 0x01: + SisCatContainer catContainer = new SisCatContainer(); + CatParser catParser = new CatParser(catContainer); + catParser.GatherPsi(section, 0); + _handler.OnSisCat(sourcePid, catContainer); + break; + case 0x02: + SisPmtContainer pmtContainer = new SisPmtContainer(); + PmtParser pmtParser = new PmtParser(pmtContainer); + pmtParser.GatherPsi(section, 0); + _handler.OnSisPmt(sourcePid, pmtContainer); + break; + case 0x40: + + case 0x42: + SisSdtContainer sdtContainer = new SisSdtContainer(); + SdtParser sdtParser = new SdtParser(sdtContainer); + sdtParser.GatherPsi(section, 0); + _handler.OnSisSdt(sourcePid, sdtContainer); + break; + case 0x4e: case 0x50: SisEitContainer eitContainer = new SisEitContainer(); EitParser eitParser = new EitParser(eitContainer); eitParser.GatherPsi(section, sourcePid); _handler.OnSisEit(sourcePid, eitContainer); + break; + case 0x70: + SisTdtContainer tdtContainer = new SisTdtContainer(); + TimetableParser tdtParser = new TimetableParser(tdtContainer, null); + tdtParser.GatherPsi(section, sourcePid); + _handler.OnSisTdt(sourcePid, tdtContainer); 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/SisSdtContainer.cs b/skyscraper8/DvbSis/SisSdtContainer.cs new file mode 100644 index 0000000..59fecee --- /dev/null +++ b/skyscraper8/DvbSis/SisSdtContainer.cs @@ -0,0 +1,46 @@ +using skyscraper5.Dvb.Psi; +using skyscraper5.Dvb.Psi.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace skyscraper8.DvbSis +{ + internal class SisSdtContainer : ISdtEventHandler + { + public ushort? NetworkId { get; private set; } + public ushort? TransportStreamId { get; private set; } + + private List sdtServices; + public void OnSdtService(ushort transportStreamId, ushort originalNetworkId, SdtService sdtService) + { + if (sdtServices == null) + sdtServices = new List(); + + sdtServices.Add(sdtService); + } + + public void SetNetworkId(ushort networkId) + { + this.NetworkId = networkId; + } + + public void SetTransportStreamId(ushort transportStreamId) + { + this.TransportStreamId = transportStreamId; + } + + public IReadOnlyList Services + { + get + { + if (sdtServices == null) + return new List().AsReadOnly(); + + return sdtServices.AsReadOnly(); + } + } + } +} diff --git a/skyscraper8/DvbSis/SisTdtContainer.cs b/skyscraper8/DvbSis/SisTdtContainer.cs new file mode 100644 index 0000000..db0579a --- /dev/null +++ b/skyscraper8/DvbSis/SisTdtContainer.cs @@ -0,0 +1,19 @@ +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 SisTdtContainer : ITdtEventHandler + { + public DateTime? UtcTime { get; private set; } + + public void OnTdtTime(DateTime utcTime) + { + this.UtcTime = utcTime; + } + } +} diff --git a/skyscraper8/Properties/launchSettings.json b/skyscraper8/Properties/launchSettings.json index 30655cc..f8cec80 100644 --- a/skyscraper8/Properties/launchSettings.json +++ b/skyscraper8/Properties/launchSettings.json @@ -1,12 +1,12 @@ -{ - "profiles": { - "skyscraper8": { - "commandName": "Project", - "commandLineArgs": "\"G:\\Stash\\utena\\dvb-sis_eutelsat5_12522_v.ts\"", - "remoteDebugEnabled": false - }, - "Container (Dockerfile)": { - "commandName": "Docker" - } - } +{ + "profiles": { + "skyscraper8": { + "commandName": "Project", + "commandLineArgs": "\"F:\\utena2\\dvb-sis_eutelsat5_12522_v.ts\"", + "remoteDebugEnabled": false + }, + "Container (Dockerfile)": { + "commandName": "Docker" + } + } } \ No newline at end of file