Began implementing ISDB BIT.
All checks were successful
🚀 Pack skyscraper8 / make-zip (push) Successful in 49s

This commit is contained in:
fey 2026-08-26 22:09:40 +02:00
parent 26145e0a8f
commit f5b8a76803
14 changed files with 130 additions and 9 deletions

View File

@ -13,7 +13,7 @@ using skyscraper5.Skyscraper.Text;
namespace skyscraper5.Dvb.Descriptors namespace skyscraper5.Dvb.Descriptors
{ {
[SkyscraperPlugin] [SkyscraperPlugin]
[TsDescriptor(0x50,"EIT","SDT")] [TsDescriptor(0x50,"EIT","SDT", "ISDB PMT")]
[BannedTable("PMT","TSDT","BAT")] [BannedTable("PMT","TSDT","BAT")]
public class ComponentDescriptor : TsDescriptor public class ComponentDescriptor : TsDescriptor
{ {

View File

@ -11,7 +11,7 @@ using skyscraper5.Skyscraper.Plugins;
namespace skyscraper5.Dvb.Descriptors namespace skyscraper5.Dvb.Descriptors
{ {
[SkyscraperPlugin] [SkyscraperPlugin]
[TsDescriptor(0x58,"TOT")] [TsDescriptor(0x58,"TOT", "ISDB TOT")]
public class LocalTimeOffsetDescriptor : TsDescriptor public class LocalTimeOffsetDescriptor : TsDescriptor
{ {
public LocalTimeOffsetDescriptor(byte[] buffer) public LocalTimeOffsetDescriptor(byte[] buffer)

View File

@ -11,8 +11,8 @@ using skyscraper5.Skyscraper.Plugins;
namespace skyscraper5.Dvb.Descriptors namespace skyscraper5.Dvb.Descriptors
{ {
[SkyscraperPlugin] [SkyscraperPlugin]
[TsDescriptor(0x7c,"PMT")] [TsDescriptor(0x7c,"PMT", "ISDB PMT")]
class AacDescriptor : TsDescriptor public class AacDescriptor : TsDescriptor
{ {
public AacDescriptor(byte[] buffer) public AacDescriptor(byte[] buffer)
{ {

View File

@ -0,0 +1,13 @@
namespace skyscraper8.Isdb.EventHandlers;
public interface IBitEventHandler
{
void BitError(BitErrors error);
}
public enum BitErrors
{
WrongTableId,
SyntaxIndicatorMissing,
SectionLengthWrong
}

View File

@ -11,6 +11,7 @@ using skyscraper5.Skyscraper.IO.CrazycatStreamReader;
using skyscraper5.Skyscraper.Scraper; using skyscraper5.Skyscraper.Scraper;
using skyscraper8.Isdb.EventHandlers; using skyscraper8.Isdb.EventHandlers;
using skyscraper8.Isdb.Psi; using skyscraper8.Isdb.Psi;
using skyscraper8.Isdb.Subtitles;
using skyscraper8.Isdb.Tables; using skyscraper8.Isdb.Tables;
using skyscraper8.Skyscraper.Scraper.Storage; using skyscraper8.Skyscraper.Scraper.Storage;
@ -165,9 +166,16 @@ public class Matenro : IPatEventHandler, ICatEventHandler, IBatEventHandler, ISd
public void OnTotTime(DateTime utcTime, LocalTimeOffsetDescriptor ltod) public void OnTotTime(DateTime utcTime, LocalTimeOffsetDescriptor ltod)
{ {
if (!_networkPid.HasValue)
return;
if (!_transportStreamId.HasValue)
return;
throw new NotImplementedException(); throw new NotImplementedException();
} }
private bool[] pidsReferencedByPmt;
private List<long> storedPmts; private List<long> storedPmts;
public void PmtEvent(IsdbPmt result, int sourcePid) public void PmtEvent(IsdbPmt result, int sourcePid)
{ {
@ -193,6 +201,12 @@ public class Matenro : IPatEventHandler, ICatEventHandler, IBatEventHandler, ISd
foreach (IsdbPmtStream pmtStream in result.Streams) foreach (IsdbPmtStream pmtStream in result.Streams)
{ {
if (pidsReferencedByPmt == null)
pidsReferencedByPmt = new bool[0x2000];
if (pidsReferencedByPmt[sourcePid])
continue;
pidsReferencedByPmt[sourcePid] = true;
StreamType streamType = DetectStreamType(pmtStream); StreamType streamType = DetectStreamType(pmtStream);
switch (streamType) switch (streamType)
{ {
@ -200,11 +214,14 @@ public class Matenro : IPatEventHandler, ICatEventHandler, IBatEventHandler, ISd
continue; continue;
case StreamType.Audio: case StreamType.Audio:
continue; continue;
case StreamType.IsdbSubtitles:
case StreamType.IsdbTeletext:
DvbContext.RegisterPacketProcessor(pmtStream.ElementaryPid, new PesDecoder(new IsdbSubtitlePesParser()));
continue;
default: default:
throw new NotImplementedException(String.Format("Could not figure out what to do with a {0} stream. It would be great if you could share a sample of this stream, so I can try to implement this.", streamType)); throw new NotImplementedException(String.Format("Could not figure out what to do with a {0} stream. It would be great if you could share a sample of this stream, so I can try to implement this.", streamType));
} }
} }
throw new NotImplementedException();
} }
private StreamType DetectStreamType(IsdbPmtStream pmtStream) private StreamType DetectStreamType(IsdbPmtStream pmtStream)
@ -217,12 +234,25 @@ public class Matenro : IPatEventHandler, ICatEventHandler, IBatEventHandler, ISd
{ {
switch (pmtStream.DataComponent.DataComponentId) switch (pmtStream.DataComponent.DataComponentId)
{ {
case 0x0008:
//STD-B24
//Sub-clause 9.6.1, Part 3, Vol. 1
return StreamType.IsdbTeletext;
case 0x0012: case 0x0012:
//Sub-clause 9.6.1, Part 3, Vol. 1
//content descriptor = Sub-clause 9.6.2, Part 3, Vol. 1
return StreamType.IsdbSubtitles; return StreamType.IsdbSubtitles;
default: default:
throw new IsdbException(String.Format("Unknown ISDB Data Component 0x{0:X4}", pmtStream.DataComponent.DataComponentId)); throw new IsdbException(String.Format("Unknown ISDB Data Component 0x{0:X4}", pmtStream.DataComponent.DataComponentId));
} }
} }
if (pmtStream.StreamType == PmtStreamType.H262)
return StreamType.Video;
if (pmtStream.StreamType == PmtStreamType.Iso13818_3Audio)
return StreamType.Audio;
if (pmtStream.StreamType == PmtStreamType.Iso11172Video)
return StreamType.Video;
throw new IsdbException(String.Format("Could not detect stream type for PID 0x{0:X4}. It would be great if you could share a sample of this stream, so I can try to implement this.", pmtStream.ElementaryPid)); throw new IsdbException(String.Format("Could not detect stream type for PID 0x{0:X4}. It would be great if you could share a sample of this stream, so I can try to implement this.", pmtStream.ElementaryPid));
} }

View File

@ -1,11 +1,42 @@
using skyscraper5.Mpeg2; using skyscraper5.Mpeg2;
using skyscraper5.Skyscraper.IO;
using skyscraper8.Isdb.EventHandlers;
namespace skyscraper8.Isdb.Psi; namespace skyscraper8.Isdb.Psi;
public class BitParser : IPsiProcessor public class BitParser : IPsiProcessor
{ {
private IBitEventHandler eventHandler;
public void GatherPsi(PsiSection section, int sourcePid) public void GatherPsi(PsiSection section, int sourcePid)
{ {
byte[] data = section.GetDataCopy();
MemoryStream ms = new MemoryStream(data);
byte tableId = ms.ReadUInt8();
if (tableId != 0xc4)
{
eventHandler.BitError(BitErrors.WrongTableId);
return;
}
ushort sectionLength = ms.ReadUInt16BE();
bool sectionSyntaxIndicator = (sectionLength & 0x8000) != 0;
if (!sectionSyntaxIndicator)
{
eventHandler.BitError(BitErrors.SyntaxIndicatorMissing);
return;
}
sectionLength &= 0x0fff;
long actualSectionLength = ms.GetAvailableBytes();
if (sectionLength > actualSectionLength)
{
eventHandler.BitError(BitErrors.SectionLengthWrong);
return;
}
//continue on 6-STD-B10v5_13-E1.pdf, page 123
throw new NotImplementedException(); throw new NotImplementedException();
} }
} }

View File

@ -134,6 +134,30 @@ public class IsdbPmtParser(IIsdbPmtEventHandler handler, int pmtPid, ushort prog
else else
throw new NotImplementedException("Multiple Data components are not yet supported - it would be great if you could share a sample recording of this stream so I can implement this."); throw new NotImplementedException("Multiple Data components are not yet supported - it would be great if you could share a sample recording of this stream so I can implement this.");
break; break;
case ComponentDescriptor cd:
if (streamChild.Component == null)
streamChild.Component = cd;
else
throw new NotImplementedException("Multiple components in one stream are not yet supported - it would be great if you could share a sample recording of this stream so I can implement this.");
break;
case DataStreamAlignmentDescriptor dsad:
if (streamChild.DataStreamAlignmentType == null)
streamChild.DataStreamAlignmentType = dsad.AlignmentType;
else
throw new NotImplementedException("Multiple Data Stream Alignments in one stream are not yet supported - it would be great if you could share a sample recording of this stream so I can implement this.");
break;
case AvcVideoDescriptor avd:
if (streamChild.AvcVideo == null)
streamChild.AvcVideo = avd;
else
throw new NotImplementedException("Multi AVC Videos in one stream are not supported yet - it would be great if you could implement this.");
break;
case AacDescriptor ad:
if (streamChild.Aac == null)
streamChild.Aac = ad;
else
throw new NotImplementedException("Multi AAC Audios in one stream are not supported yet - it would be great if you could implement this.");
break;
default: default:
throw new NotImplementedException("Unknown descriptor type in ISDB PMT: " + descriptor.GetType() + " - it would be fabulous if you could share a sample of this stream so this can be implemented!"); throw new NotImplementedException("Unknown descriptor type in ISDB PMT: " + descriptor.GetType() + " - it would be fabulous if you could share a sample of this stream so this can be implemented!");
} }

View File

@ -0,0 +1,6 @@
namespace skyscraper8.Isdb.Subtitles;
public interface IIsdbSubtitleHandler
{
}

View File

@ -0,0 +1,11 @@
using skyscraper5.Mpeg2;
namespace skyscraper8.Isdb.Subtitles;
class IsdbSubtitlePesParser : IPesProcessor
{
public void ProcessPesPacket(PesPacket packet)
{
throw new NotImplementedException();
}
}

View File

@ -1,3 +1,4 @@
using skyscraper5.Dvb.Descriptors;
using skyscraper5.Mpeg2.Descriptors; using skyscraper5.Mpeg2.Descriptors;
using skyscraper5.Mpeg2.Psi.Model; using skyscraper5.Mpeg2.Psi.Model;
using skyscraper8.Isdb.Descriptors; using skyscraper8.Isdb.Descriptors;
@ -11,4 +12,8 @@ public class IsdbPmtStream(PmtStreamType streamType, int elementaryPid)
public byte? StreamIdentifierComponentTag { get; set; } public byte? StreamIdentifierComponentTag { get; set; }
public Iso639LanguageDescriptor Iso639Language { get; set; } public Iso639LanguageDescriptor Iso639Language { get; set; }
public _0xFD_DataComponentDescriptor DataComponent { get; set; } public _0xFD_DataComponentDescriptor DataComponent { get; set; }
public ComponentDescriptor Component { get; set; }
public byte? DataStreamAlignmentType { get; set; }
public AvcVideoDescriptor AvcVideo { get; set; }
public AacDescriptor Aac { get; set; }
} }

View File

@ -9,7 +9,7 @@ using skyscraper5.Skyscraper.Plugins;
namespace skyscraper5.Mpeg2.Descriptors namespace skyscraper5.Mpeg2.Descriptors
{ {
[SkyscraperPlugin] [SkyscraperPlugin]
[TsDescriptor(0x06,"PMT")] [TsDescriptor(0x06,"PMT", "ISDB PMT")]
[BannedTable("TSDT")] [BannedTable("TSDT")]
class DataStreamAlignmentDescriptor : TsDescriptor class DataStreamAlignmentDescriptor : TsDescriptor
{ {

View File

@ -10,8 +10,8 @@ using skyscraper5.Skyscraper.Plugins;
namespace skyscraper5.Mpeg2.Descriptors namespace skyscraper5.Mpeg2.Descriptors
{ {
[SkyscraperPlugin] [SkyscraperPlugin]
[TsDescriptor(0x28,"PMT")] [TsDescriptor(0x28,"PMT", "ISDB PMT")]
class AvcVideoDescriptor : TsDescriptor public class AvcVideoDescriptor : TsDescriptor
{ {
public AvcVideoDescriptor(byte[] buffer) public AvcVideoDescriptor(byte[] buffer)
{ {

View File

@ -33,6 +33,7 @@ namespace skyscraper5.Skyscraper.Scraper
SisFramingAndTiming, SisFramingAndTiming,
SisDaughterSiteAdapterConfiguration, SisDaughterSiteAdapterConfiguration,
SisPsiTables, SisPsiTables,
IsdbSubtitles IsdbSubtitles,
IsdbTeletext
} }
} }