diff --git a/skyscraper8.sln.DotSettings.user b/skyscraper8.sln.DotSettings.user
index 410bc16..0f7a660 100644
--- a/skyscraper8.sln.DotSettings.user
+++ b/skyscraper8.sln.DotSettings.user
@@ -44,6 +44,7 @@
ForceIncluded
ForceIncluded
ForceIncluded
+ ForceIncluded
ForceIncluded
ForceIncluded
ForceIncluded
diff --git a/skyscraper8/Dvb/Psi/BatParser.cs b/skyscraper8/Dvb/Psi/BatParser.cs
index 3ec518a..59082c7 100644
--- a/skyscraper8/Dvb/Psi/BatParser.cs
+++ b/skyscraper8/Dvb/Psi/BatParser.cs
@@ -9,11 +9,13 @@ using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Mpeg2;
using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Skyscraper.IO;
+using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.Skyscraper.Plugins;
+using skyscraper8.Skyscraper;
namespace skyscraper5.Dvb.Psi
{
- class BatParser : IPsiProcessor
+ class BatParser : IPsiProcessor, IMultistandardTable
{
public IBatEventHandler EventHandler { get; }
@@ -50,7 +52,7 @@ namespace skyscraper5.Dvb.Psi
int bouquetDescriptorsLength = (readUInt16Be & 0x0fff);
byte[] bouquetDescriptorsData = ms.ReadBytes(bouquetDescriptorsLength);
- IEnumerable outerDescriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(bouquetDescriptorsData, "BAT");
+ IEnumerable outerDescriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(bouquetDescriptorsData, GetTableType());
BatBouquet batBouquet = ParseOuterDescriptors(outerDescriptors,bouquetId);
readUInt16Be = ms.ReadUInt16BE();
@@ -80,7 +82,7 @@ namespace skyscraper5.Dvb.Psi
if (ms.GetAvailableBytes() < transportDescriptorsLength)
break;
byte[] transportDescriptorsData = ms.ReadBytes(transportDescriptorsLength);
- IEnumerable descriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(transportDescriptorsData, "BAT");
+ IEnumerable descriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(transportDescriptorsData, GetTableType());
BatTransportStream child = ParseInnerDescriptors(transportStreamId, originalNetworkId, descriptors);
//EventHandler.OnBatTransportStream(batBouquet, child);
yield return child;
@@ -209,5 +211,23 @@ namespace skyscraper5.Dvb.Psi
return result;
}
+
+ private STD_TYPE standard;
+ public void SetStandard(STD_TYPE standard)
+ {
+ this.standard = standard;
+ }
+
+ private string GetTableType()
+ {
+ if (IMultistandardTable.IsIsdb(standard))
+ {
+ return "ISDB BAT";
+ }
+ else
+ {
+ return "BAT";
+ }
+ }
}
}
diff --git a/skyscraper8/Dvb/Psi/EitParser.cs b/skyscraper8/Dvb/Psi/EitParser.cs
index c10bf15..2b7e070 100644
--- a/skyscraper8/Dvb/Psi/EitParser.cs
+++ b/skyscraper8/Dvb/Psi/EitParser.cs
@@ -8,12 +8,14 @@ using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Mpeg2;
using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Skyscraper.IO;
+using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.Skyscraper.Plugins;
using skyscraper8.Dvb.Descriptors.Extension;
+using skyscraper8.Skyscraper;
namespace skyscraper5.Dvb.Psi
{
- public class EitParser : IPsiProcessor
+ public class EitParser : IPsiProcessor, IMultistandardTable
{
public EitParser(IEitEventHandler eventHandler)
{
@@ -120,7 +122,7 @@ namespace skyscraper5.Dvb.Psi
private void UnpackDescriptors(byte[] input, EitEvent output)
{
- IEnumerable dvbDescriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(input, "EIT");
+ IEnumerable dvbDescriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(input, GetTableType());
foreach (TsDescriptor dvbDescriptor in dvbDescriptors)
{
string name = dvbDescriptor.GetType().Name;
@@ -254,5 +256,23 @@ namespace skyscraper5.Dvb.Psi
DescriptorPluginEitHandlerAttribute handlerAttribute = (DescriptorPluginEitHandlerAttribute)customAttribute;
handlerAttribute.Handler.HandleEit(output, unpacked);
}
+
+ private STD_TYPE standard;
+ public void SetStandard(STD_TYPE standard)
+ {
+ this.standard = standard;
+ }
+
+ private string GetTableType()
+ {
+ if (IMultistandardTable.IsIsdb(standard))
+ {
+ return "ISDB EIT";
+ }
+ else
+ {
+ return "EIT";
+ }
+ }
}
}
diff --git a/skyscraper8/Dvb/Psi/Pid0x11Decoder.cs b/skyscraper8/Dvb/Psi/Pid0x11Decoder.cs
index 1208ac9..1dedd24 100644
--- a/skyscraper8/Dvb/Psi/Pid0x11Decoder.cs
+++ b/skyscraper8/Dvb/Psi/Pid0x11Decoder.cs
@@ -4,10 +4,12 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using skyscraper5.Mpeg2;
+using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
+using skyscraper8.Skyscraper;
namespace skyscraper5.Dvb.Psi
{
- class Pid0x11Decoder : IPsiProcessor
+ class Pid0x11Decoder : IPsiProcessor, IMultistandardTable
{
public Pid0x11Decoder(IBatEventHandler batEventHandler, ISdtEventHandler sdtEventHandler)
@@ -36,5 +38,11 @@ namespace skyscraper5.Dvb.Psi
return;
}
}
+
+ public void SetStandard(STD_TYPE standard)
+ {
+ SdtParser.SetStandard(standard);
+ BatParser.SetStandard(standard);
+ }
}
}
diff --git a/skyscraper8/Dvb/Psi/RstParser.cs b/skyscraper8/Dvb/Psi/RstParser.cs
index 424b9d9..03c9182 100644
--- a/skyscraper8/Dvb/Psi/RstParser.cs
+++ b/skyscraper8/Dvb/Psi/RstParser.cs
@@ -7,10 +7,12 @@ using System.Threading.Tasks;
using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.IO;
using skyscraper5.Dvb.Psi.Model;
+using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
+using skyscraper8.Skyscraper;
namespace skyscraper5.Dvb.Psi
{
- class RstParser : IPsiProcessor
+ class RstParser : IPsiProcessor, IMultistandardTable
{
public IRstEventHandler EventHandler { get; }
@@ -44,5 +46,23 @@ namespace skyscraper5.Dvb.Psi
EventHandler.NotifyRunningStatus(transportStreamId, originalNetworkId, serviceId, eventId, runningStatus);
}
}
+
+ private STD_TYPE standard;
+ public void SetStandard(STD_TYPE standard)
+ {
+ this.standard = standard;
+ }
+
+ private string GetTableType()
+ {
+ if (IMultistandardTable.IsIsdb(standard))
+ {
+ return "ISDB RST";
+ }
+ else
+ {
+ return "RST";
+ }
+ }
}
}
diff --git a/skyscraper8/Dvb/Psi/SdtParser.cs b/skyscraper8/Dvb/Psi/SdtParser.cs
index 9259e53..d499c59 100644
--- a/skyscraper8/Dvb/Psi/SdtParser.cs
+++ b/skyscraper8/Dvb/Psi/SdtParser.cs
@@ -10,10 +10,12 @@ using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Mpeg2;
using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Skyscraper.IO;
+using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
+using skyscraper8.Skyscraper;
namespace skyscraper5.Dvb.Psi
{
- class SdtParser : IPsiProcessor
+ class SdtParser : IPsiProcessor, IMultistandardTable
{
public ISdtEventHandler EventHandler { get; }
@@ -81,7 +83,7 @@ namespace skyscraper5.Dvb.Psi
SdtService child = new SdtService(serviceId, eitScheduleFlag, eitPresentFollowingFlag, runningStatus, freeCaMode);
byte[] descriptorsData = ms.ReadBytes(descriptorsLoopLength);
- IEnumerable unpackDescriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(descriptorsData, "SDT");
+ IEnumerable unpackDescriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(descriptorsData, GetTableType());
foreach (TsDescriptor dvbDescriptor in unpackDescriptors)
{
string name = dvbDescriptor.GetType().Name;
@@ -212,5 +214,23 @@ namespace skyscraper5.Dvb.Psi
throw new NotImplementedException(name);
}
}
+
+ private STD_TYPE standard;
+ public void SetStandard(STD_TYPE standard)
+ {
+ this.standard = standard;
+ }
+
+ private string GetTableType()
+ {
+ if (IMultistandardTable.IsIsdb(standard))
+ {
+ return "ISDB SDT";
+ }
+ else
+ {
+ return "SDT";
+ }
+ }
}
}
diff --git a/skyscraper8/Dvb/Psi/TimetableParser.cs b/skyscraper8/Dvb/Psi/TimetableParser.cs
index 028aa9a..d4f4878 100644
--- a/skyscraper8/Dvb/Psi/TimetableParser.cs
+++ b/skyscraper8/Dvb/Psi/TimetableParser.cs
@@ -7,10 +7,12 @@ using System.Threading.Tasks;
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.IO;
+using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
+using skyscraper8.Skyscraper;
namespace skyscraper5.Dvb.Psi
{
- public class TimetableParser : IPsiProcessor
+ public class TimetableParser : IPsiProcessor, IMultistandardTable
{
public ITdtEventHandler TdtEventHandler { get; }
public ITotEventHandler TotEventHandler { get; }
@@ -76,7 +78,7 @@ namespace skyscraper5.Dvb.Psi
LocalTimeOffsetDescriptor ltod = null;
byte[] descriptorsData = ms.ReadBytes(descriptorsLoopLength);
- IEnumerable unpackDescriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(descriptorsData, "TOT");
+ IEnumerable unpackDescriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(descriptorsData, GetTableType());
foreach (TsDescriptor dvbDescriptor in unpackDescriptors)
{
string name = dvbDescriptor.GetType().Name;
@@ -98,5 +100,23 @@ namespace skyscraper5.Dvb.Psi
}
}
}
+
+ private STD_TYPE standard;
+ public void SetStandard(STD_TYPE standard)
+ {
+ this.standard = standard;
+ }
+
+ private string GetTableType()
+ {
+ if (IMultistandardTable.IsIsdb(standard))
+ {
+ return "ISDB TOT";
+ }
+ else
+ {
+ return "TOT";
+ }
+ }
}
}
diff --git a/skyscraper8/Isdb/Matenro.cs b/skyscraper8/Isdb/Matenro.cs
index e09546b..0e866fc 100644
--- a/skyscraper8/Isdb/Matenro.cs
+++ b/skyscraper8/Isdb/Matenro.cs
@@ -1,11 +1,20 @@
+using log4net;
+using log4net.Repository.Hierarchy;
+using skyscraper5.Dvb.Descriptors;
+using skyscraper5.Dvb.Psi;
+using skyscraper5.Dvb.Psi.Model;
using skyscraper5.Mpeg2;
+using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Mpeg2.Psi;
+using skyscraper5.Mpeg2.Psi.Model;
+using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.Skyscraper.Scraper;
+using skyscraper8.Isdb.Psi;
using skyscraper8.Skyscraper.Scraper.Storage;
namespace skyscraper8.Isdb;
-public class Matenro : IPatEventHandler
+public class Matenro : IPatEventHandler, ICatEventHandler, IPmtEventHandler, IBatEventHandler, ISdtEventHandler, IEitEventHandler, IRstEventHandler, ITdtEventHandler, ITotEventHandler
{
public TsContext DvbContext { get; }
public DataStorage DataStorage { get; }
@@ -13,6 +22,12 @@ public class Matenro : IPatEventHandler
public ISkyscraperUiJunction UiJunction { get; }
public Action LogEvent { get; }
+ private ILog logger;
+ private ushort? _transportStreamId;
+ private ushort? _networkPid;
+ private LitParser _litParser;
+ private ErtParser _ertParser;
+
public Matenro(TsContext dvbContext, DataStorage dataStorage, ObjectStorage objectStorage, ISkyscraperUiJunction uiJunction, Action logEvent)
{
DvbContext = dvbContext;
@@ -21,20 +36,137 @@ public class Matenro : IPatEventHandler
UiJunction = uiJunction;
LogEvent = logEvent;
- dvbContext.RegisterPacketProcessor(0, new PsiDecoder(0, new PatParser(this)));
+ logger = LogManager.GetLogger(this.GetType());
+
+
+ Pid0x11Decoder pid0X11Decoder = new Pid0x11Decoder(this, this);
+ pid0X11Decoder.SetStandard(STD_TYPE.STD_ISDBT);
+
+ EitParser eitParser = new EitParser(this);
+ eitParser.SetStandard(STD_TYPE.STD_ISDBT);
+
+ RstParser rstParser = new RstParser(this);
+ rstParser.SetStandard(STD_TYPE.STD_ISDBT);
+
+ TimetableParser tdtParser = new TimetableParser(this, this);
+ tdtParser.SetStandard(STD_TYPE.STD_ISDBT);
+
+ _litParser = new LitParser();
+
+ SdttParser sdttParser = new SdttParser();
+
+ dvbContext.RegisterPacketProcessor(0x0000, new PsiDecoder(0x0000, new PatParser(this)));
+ dvbContext.RegisterPacketProcessor(0x0001, new PsiDecoder(0x0001, new CatParser(this)));
+ dvbContext.RegisterPacketProcessor(0x0011, new PsiDecoder(0x0011, pid0X11Decoder));
+ dvbContext.RegisterPacketProcessor(0x0012, new PsiDecoder(0x0012, eitParser));
+ dvbContext.RegisterPacketProcessor(0x0013, new PsiDecoder(0x0013, rstParser));
+ dvbContext.RegisterPacketProcessor(0x0014, new PsiDecoder(0x0014, tdtParser));
+ dvbContext.RegisterPacketProcessor(0x0017, new PsiDecoder(0x0017, new DctParser()));
+ dvbContext.RegisterPacketProcessor(0x001e, new PsiDecoder(0x001e, new DitParser()));
+ dvbContext.RegisterPacketProcessor(0x001f, new PsiDecoder(0x001f, new SitParser()));
+ dvbContext.RegisterPacketProcessor(0x0020, new PsiDecoder(0x0020, _litParser));
+ dvbContext.RegisterPacketProcessor(0x0021, new PsiDecoder(0x0021, _ertParser));
+ dvbContext.RegisterPacketProcessor(0x0022, new PsiDecoder(0x0022, new PcatParser()));
+ dvbContext.RegisterPacketProcessor(0x0023, new PsiDecoder(0x0023, sdttParser));
+ dvbContext.RegisterPacketProcessor(0x0024, new PsiDecoder(0x0024, new BitParser()));
+ dvbContext.RegisterPacketProcessor(0x0025, new PsiDecoder(0x0025, new IsdbPid25Parser()));
+ dvbContext.RegisterPacketProcessor(0x0026, new PsiDecoder(0x0026, eitParser));
+ dvbContext.RegisterPacketProcessor(0x0027, new PsiDecoder(0x0027, eitParser));
+ dvbContext.RegisterPacketProcessor(0x0028, new PsiDecoder(0x0028, sdttParser));
+ dvbContext.RegisterPacketProcessor(0x0029, new PsiDecoder(0x0029, new CdtParser()));
+ dvbContext.RegisterPacketProcessor(0x002d, new PsiDecoder(0x002d, new FragmentedTlvPacketParser()));
+ dvbContext.RegisterPacketProcessor(0x002e, new PsiDecoder(0x002e, new AmtParser()));
+ dvbContext.RegisterPacketProcessor(0x002f, new PsiDecoder(0x002f, new MultipleFrameHeaderInformationParser()));
}
public void NetworkPidFromPat(int networkPid)
+ {
+ if (_networkPid != null)
+ {
+ logger.InfoFormat("Network PID changed from {0} to {1}", this._networkPid.Value, networkPid);
+ }
+
+ this._networkPid = _networkPid;
+ }
+
+ private bool[] pmtPidsAssociated;
+
+ public void ProgramMapPidFromPat(int pmtPid, ushort programNumber)
+ {
+ if (pmtPidsAssociated == null)
+ pmtPidsAssociated = new bool[0x2000];
+
+ if (pmtPidsAssociated[pmtPid] == false)
+ {
+ PmtParser pmtParser = new PmtParser(this);
+ pmtParser.SetStandard(STD_TYPE.STD_ISDBT);
+ DvbContext.RegisterPacketProcessor(pmtPid, new PsiDecoder(pmtPid, pmtParser));
+ logger.InfoFormat("PAT points to a PMT on PID 0x{0:X4}.", pmtPid);
+ pmtPidsAssociated[pmtPid] = true;
+ }
+ }
+
+ public void OnSdtService(ushort transportStreamId, ushort originalNetworkId, SdtService sdtService)
{
throw new NotImplementedException();
}
- public void ProgramMapPidFromPat(int pmtPid, ushort programNumber)
+ public void SetNetworkId(ushort networkId)
{
throw new NotImplementedException();
}
public void SetTransportStreamId(ushort transportStreamId)
+ {
+ if (_transportStreamId != null)
+ {
+ logger.InfoFormat("TSID changed from {0} to {1}", this._transportStreamId.Value, transportStreamId);
+ }
+ _transportStreamId = transportStreamId;
+ }
+
+ public void SetNetworkId(ushort networkId, bool forceOverwrite = false)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnEitEvent(EitEvent eitEvent)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void NotifyOfCaSystem(CaDescriptor caDescriptor, bool fromPmt = false)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void PmtEvent(ProgramMapping result, int pmtPid)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnBatBouquet(BatBouquet batBouquet)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnBatTransportStream(BatBouquet batBouquet, BatTransportStream child)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void NotifyRunningStatus(uint transportStreamId, uint originalNetworkId, uint serviceId, uint eventId,
+ RunningStatus runningStatus)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnTdtTime(DateTime utcTime)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnTotTime(DateTime utcTime, LocalTimeOffsetDescriptor ltod)
{
throw new NotImplementedException();
}
diff --git a/skyscraper8/Isdb/Psi/AmtParser.cs b/skyscraper8/Isdb/Psi/AmtParser.cs
new file mode 100644
index 0000000..1d1cfa1
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/AmtParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class AmtParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/BitParser.cs b/skyscraper8/Isdb/Psi/BitParser.cs
new file mode 100644
index 0000000..f56e3c8
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/BitParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class BitParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/CdtParser.cs b/skyscraper8/Isdb/Psi/CdtParser.cs
new file mode 100644
index 0000000..62ffa70
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/CdtParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class CdtParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/DctParser.cs b/skyscraper8/Isdb/Psi/DctParser.cs
new file mode 100644
index 0000000..88d171c
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/DctParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class DctParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/DitParser.cs b/skyscraper8/Isdb/Psi/DitParser.cs
new file mode 100644
index 0000000..1fc4c87
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/DitParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class DitParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/ErtParser.cs b/skyscraper8/Isdb/Psi/ErtParser.cs
new file mode 100644
index 0000000..4e850fd
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/ErtParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class ErtParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/FragmentedTlvPacketParser.cs b/skyscraper8/Isdb/Psi/FragmentedTlvPacketParser.cs
new file mode 100644
index 0000000..c4f2cb9
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/FragmentedTlvPacketParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class FragmentedTlvPacketParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/IsdbPid25Parser.cs b/skyscraper8/Isdb/Psi/IsdbPid25Parser.cs
new file mode 100644
index 0000000..314299b
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/IsdbPid25Parser.cs
@@ -0,0 +1,12 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class IsdbPid25Parser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ //either NBIT or LDT
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/LitParser.cs b/skyscraper8/Isdb/Psi/LitParser.cs
new file mode 100644
index 0000000..c41011a
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/LitParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class LitParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/MultipleFrameHeaderInformationParser.cs b/skyscraper8/Isdb/Psi/MultipleFrameHeaderInformationParser.cs
new file mode 100644
index 0000000..8d32c90
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/MultipleFrameHeaderInformationParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class MultipleFrameHeaderInformationParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/PcatParser.cs b/skyscraper8/Isdb/Psi/PcatParser.cs
new file mode 100644
index 0000000..8c8a0ea
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/PcatParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class PcatParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/SdttParser.cs b/skyscraper8/Isdb/Psi/SdttParser.cs
new file mode 100644
index 0000000..3cccddb
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/SdttParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class SdttParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Isdb/Psi/SitParser.cs b/skyscraper8/Isdb/Psi/SitParser.cs
new file mode 100644
index 0000000..51bb3ff
--- /dev/null
+++ b/skyscraper8/Isdb/Psi/SitParser.cs
@@ -0,0 +1,11 @@
+using skyscraper5.Mpeg2;
+
+namespace skyscraper8.Isdb.Psi;
+
+public class SitParser : IPsiProcessor
+{
+ public void GatherPsi(PsiSection section, int sourcePid)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/skyscraper8/Mpeg2/Psi/PmtParser.cs b/skyscraper8/Mpeg2/Psi/PmtParser.cs
index f48025e..3c248f2 100644
--- a/skyscraper8/Mpeg2/Psi/PmtParser.cs
+++ b/skyscraper8/Mpeg2/Psi/PmtParser.cs
@@ -11,11 +11,13 @@ using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Mpeg2.ExtensionDescriptors;
using skyscraper5.Mpeg2.Psi.Model;
using skyscraper5.Skyscraper.IO;
+using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.src.Mpeg2.Descriptors;
+using skyscraper8.Skyscraper;
namespace skyscraper5.Mpeg2.Psi
{
- class PmtParser : IPsiProcessor
+ class PmtParser : IPsiProcessor, IMultistandardTable
{
public IPmtEventHandler EventHandler { get; }
@@ -98,7 +100,7 @@ namespace skyscraper5.Mpeg2.Psi
private void ParseInnerDescriptors(ProgramMappingStream output, byte[] inputBuffer)
{
- IEnumerable descriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(inputBuffer, "PMT");
+ IEnumerable descriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(inputBuffer, GetTableType());
foreach (TsDescriptor dvbDescriptor in descriptors)
{
output.NumDescriptors++;
@@ -406,7 +408,7 @@ namespace skyscraper5.Mpeg2.Psi
private void ParseOuterDescriptors(ProgramMapping output, byte[] inputBuffer)
{
- IEnumerable descriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(inputBuffer, "PMT");
+ IEnumerable descriptors = TsDescriptorUnpacker.GetInstance().UnpackDescriptors(inputBuffer, GetTableType());
foreach (TsDescriptor tsDescriptor in descriptors)
{
string name = tsDescriptor.GetType().Name;
@@ -590,5 +592,23 @@ namespace skyscraper5.Mpeg2.Psi
}
}
+
+ private STD_TYPE standard;
+ public void SetStandard(STD_TYPE standard)
+ {
+ this.standard = standard;
+ }
+
+ private string GetTableType()
+ {
+ if (IMultistandardTable.IsIsdb(standard))
+ {
+ return "ISDB PMT";
+ }
+ else
+ {
+ return "PMT";
+ }
+ }
}
}
diff --git a/skyscraper8/Skyscraper/IMultistandardTable.cs b/skyscraper8/Skyscraper/IMultistandardTable.cs
new file mode 100644
index 0000000..edefcde
--- /dev/null
+++ b/skyscraper8/Skyscraper/IMultistandardTable.cs
@@ -0,0 +1,36 @@
+using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
+
+namespace skyscraper8.Skyscraper;
+
+public interface IMultistandardTable
+{
+ void SetStandard(STD_TYPE standard);
+
+ public static bool IsIsdb(STD_TYPE standard)
+ {
+ switch (standard)
+ {
+ case STD_TYPE.STD_ISDBT:
+ case STD_TYPE.STD_ISDBS:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ public static bool IsDvb(STD_TYPE standard)
+ {
+ switch (standard)
+ {
+ case STD_TYPE.STD_DVBC:
+ case STD_TYPE.STD_DVBC2:
+ case STD_TYPE.STD_DVBS:
+ case STD_TYPE.STD_DVBS2:
+ case STD_TYPE.STD_DVBT:
+ case STD_TYPE.STD_DVBT2:
+ return true;
+ default:
+ return false;
+ }
+ }
+}
\ No newline at end of file