From c03d4238bf839ab543847597be4f6335d0bc8401 Mon Sep 17 00:00:00 2001 From: feyris-tan Date: Tue, 4 Nov 2025 16:21:01 +0100 Subject: [PATCH] Added an option that dumps single BBFrames to files. --- skyscraper8.sln.DotSettings.user | 1 + skyscraper8/GS/POC/Pts2Bbf2.cs | 52 ++++++++++++++++++++++++++++++++ skyscraper8/Program.cs | 8 +++++ 3 files changed, 61 insertions(+) create mode 100644 skyscraper8/GS/POC/Pts2Bbf2.cs diff --git a/skyscraper8.sln.DotSettings.user b/skyscraper8.sln.DotSettings.user index 296c055..3f27e6a 100644 --- a/skyscraper8.sln.DotSettings.user +++ b/skyscraper8.sln.DotSettings.user @@ -1,6 +1,7 @@  ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded diff --git a/skyscraper8/GS/POC/Pts2Bbf2.cs b/skyscraper8/GS/POC/Pts2Bbf2.cs new file mode 100644 index 0000000..e3b113f --- /dev/null +++ b/skyscraper8/GS/POC/Pts2Bbf2.cs @@ -0,0 +1,52 @@ +using skyscraper5.Mpeg2; +using skyscraper5.Skyscraper.IO; +using skyscraper5.Skyscraper.Scraper; +using skyscraper5.Skyscraper.Scraper.Storage.InMemory; +using skyscraper8.Skyscraper.Scraper.Storage; + +namespace skyscraper8.GSE; + +public class Pts2Bbf2 : IBbframeDeencapsulator +{ + private readonly FileInfo _fi; + private readonly DirectoryInfo outputDir; + + public Pts2Bbf2(FileInfo fi) + { + _fi = fi; + string outputPath = Path.Combine(_fi.Directory.FullName, Path.GetFileNameWithoutExtension(_fi.Name) + "_frames"); + outputDir = new DirectoryInfo(outputPath); + outputDir.EnsureExists(); + } + + public void Run() + { + TsContext mpeg2 = new TsContext(); + Stid135BbFrameReader bbFrameReader = new Stid135BbFrameReader(null, null, this); + mpeg2.RegisterPacketProcessor(0x010e, bbFrameReader); + + SkyscraperContext context = new SkyscraperContext(mpeg2, new InMemoryScraperStorage(), new NullObjectStorage()); + context.InitalizeFilterChain(); + + FileStream fileStream = _fi.OpenRead(); + context.IngestFromStream(fileStream); + } + + private int frameNo; + public void PushPacket(byte[] bbframe) + { + if (bbframe[0] != 0xb8) + { + return; + } + + BBHeader bbHeader = new BBHeader(bbframe, 1); + if (!bbHeader.Valid) + return; + + string fname = String.Format("Frame{0:D8}_TSGS{1}_MIS{2:D3}_SYNC{3:D3}.ts", ++frameNo,bbHeader.TsGs,bbHeader.SisMis ? bbHeader.Matype2 : 0,bbHeader.SyncByte); + fname = Path.Combine(outputDir.FullName, fname); + ReadOnlySpan readOnlySpan = new ReadOnlySpan(bbframe, 11, bbframe.Length - 11); + File.WriteAllBytes(fname, readOnlySpan.ToArray()); + } +} \ No newline at end of file diff --git a/skyscraper8/Program.cs b/skyscraper8/Program.cs index cff18c6..da9b60b 100644 --- a/skyscraper8/Program.cs +++ b/skyscraper8/Program.cs @@ -336,6 +336,14 @@ namespace skyscraper5 } } + if (args[0].ToLowerInvariant().Equals("pts2bbf2")) + { + FileInfo fi = new FileInfo(args[1]); + Pts2Bbf2 pts2Bbf2 = new Pts2Bbf2(fi); + pts2Bbf2.Run(); + return; + } + if (args[0].ToLowerInvariant().Equals("stid135test")) { FileInfo fi = new FileInfo(args[1]);