diff --git a/skyscraper8.sln.DotSettings.user b/skyscraper8.sln.DotSettings.user index f031d72..24e0a36 100644 --- a/skyscraper8.sln.DotSettings.user +++ b/skyscraper8.sln.DotSettings.user @@ -1,2 +1,3 @@  + ForceIncluded <data><HostParameters type="LocalHostParameters" /><Argument type="StandaloneArgument"><Arguments IsNull="False"></Arguments><FileName IsNull="False"></FileName><WorkingDirectory IsNull="False"></WorkingDirectory><Scope><ProcessFilters /></Scope></Argument><Info type="TimelineInfo" /><CoreOptions type="CoreOptions"><CoreTempPath IsNull="False"></CoreTempPath><RemoteEndPoint IsNull="False"></RemoteEndPoint><AdditionalEnvironmentVariables /></CoreOptions><HostOptions type="HostOptions"><HostTempPath IsNull="False"></HostTempPath></HostOptions></data> \ No newline at end of file diff --git a/skyscraper8/GSE/BbframeDeencapsulator.cs b/skyscraper8/GSE/BbframeDeencapsulator.cs index ab2f788..523545b 100644 --- a/skyscraper8/GSE/BbframeDeencapsulator.cs +++ b/skyscraper8/GSE/BbframeDeencapsulator.cs @@ -13,7 +13,7 @@ using log4net; namespace skyscraper8.GSE { - internal class BbframeDeencapsulator + internal class BbframeDeencapsulator : IBbframeDeencapsulator { private bool interruptedGseHem; private MemoryStream interruptedGseHemBuffer; diff --git a/skyscraper8/GSE/BbframeDumper.cs b/skyscraper8/GSE/BbframeDumper.cs new file mode 100644 index 0000000..37caf26 --- /dev/null +++ b/skyscraper8/GSE/BbframeDumper.cs @@ -0,0 +1,26 @@ +using skyscraper5.Skyscraper.IO; + +namespace skyscraper8.GSE; + +public class BbframeDumper : IBbframeDeencapsulator, IDisposable +{ + public BbframeDumper(FileInfo file) + { + file.Directory.EnsureExists(); + ourStream = file.OpenWrite(); + } + + private FileStream ourStream; + + public void PushPacket(byte[] bbframe) + { + ourStream.Write(bbframe, 0, bbframe.Length); + } + + public void Dispose() + { + ourStream.Flush(); + ourStream.Close(); + ourStream.Dispose(); + } +} \ No newline at end of file diff --git a/skyscraper8/Skyscraper/GsEventHandler.cs b/skyscraper8/GSE/GsEventHandler.cs similarity index 100% rename from skyscraper8/Skyscraper/GsEventHandler.cs rename to skyscraper8/GSE/GsEventHandler.cs diff --git a/skyscraper8/GSE/IBbframeDeencapsulator.cs b/skyscraper8/GSE/IBbframeDeencapsulator.cs new file mode 100644 index 0000000..b4a3b4e --- /dev/null +++ b/skyscraper8/GSE/IBbframeDeencapsulator.cs @@ -0,0 +1,6 @@ +namespace skyscraper8.GSE; + +public interface IBbframeDeencapsulator +{ + public void PushPacket(byte[] bbframe); +} \ No newline at end of file diff --git a/skyscraper8/GSE/NullGsEventHandler.cs b/skyscraper8/GSE/NullGsEventHandler.cs new file mode 100644 index 0000000..3d29335 --- /dev/null +++ b/skyscraper8/GSE/NullGsEventHandler.cs @@ -0,0 +1,16 @@ +using skyscraper5.Skyscraper; + +namespace skyscraper8.GSE; + +public class NullGsEventHandler : IGsEventHandler +{ + public void OnIpDatagram(int pid, byte[] payload) + { + + } + + public void GsIpTrafficDetected() + { + + } +} \ No newline at end of file diff --git a/skyscraper8/GSE/Pts2Bbf.cs b/skyscraper8/GSE/Pts2Bbf.cs new file mode 100644 index 0000000..60dd0a3 --- /dev/null +++ b/skyscraper8/GSE/Pts2Bbf.cs @@ -0,0 +1,37 @@ +using log4net; +using skyscraper5.Mpeg2; +using skyscraper5.Skyscraper.Scraper; +using skyscraper5.Skyscraper.Scraper.Storage.InMemory; +using skyscraper8.Skyscraper.Scraper.Storage; + +namespace skyscraper8.GSE; + +public class Pts2Bbf +{ + private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name); + + public static void Run(FileInfo file) + { + if (!file.Exists) + { + logger.Error("File not found: " + file.FullName); + return; + } + + string changeExtension = Path.ChangeExtension(file.FullName, ".sbbf"); + BbframeDumper dumper = new BbframeDumper(new FileInfo(changeExtension)); + + FileStream fileStream = file.OpenRead(); + + TsContext mpeg2 = new TsContext(); + mpeg2.RegisterPacketProcessor(0x010e, new Stid135BbFrameReader(new NullGsEventHandler(),dumper)); + DataStorage dataStorage = new InMemoryScraperStorage(); + ObjectStorage objectStorage = new NullObjectStorage(); + SkyscraperContext skyscraper = new SkyscraperContext(mpeg2, dataStorage, objectStorage); + skyscraper.InitalizeFilterChain(); + skyscraper.IngestFromStream(fileStream); + + fileStream.Close(); + logger.Info("Pts2Bbf finished"); + } +} \ No newline at end of file diff --git a/skyscraper8/GSE/Stid135BbFrameReader.cs b/skyscraper8/GSE/Stid135BbFrameReader.cs index c56264e..e42f903 100644 --- a/skyscraper8/GSE/Stid135BbFrameReader.cs +++ b/skyscraper8/GSE/Stid135BbFrameReader.cs @@ -12,11 +12,15 @@ namespace skyscraper8.GSE internal class Stid135BbFrameReader : ITsPacketProcessor { private IGsEventHandler mpeEventHandler; - private BbframeDeencapsulator deencapsulator; + private IBbframeDeencapsulator deencapsulator; - public Stid135BbFrameReader(IGsEventHandler mpeEventHandler) + public Stid135BbFrameReader(IGsEventHandler mpeEventHandler, IBbframeDeencapsulator deencapsulator = null) { + if (deencapsulator == null) + deencapsulator = new BbframeDeencapsulator(); + this.mpeEventHandler = mpeEventHandler; + this.deencapsulator = deencapsulator; } private long packetsRecovered; @@ -33,18 +37,30 @@ namespace skyscraper8.GSE if (pid != 0x010e) return; + if (outbuf == null) + outbuf = new MemoryStream(); + if ((packets[8] & 0xff) == 0xb8) + { + if (outbuf.Length > 0) + { + byte[] completeBbframe = outbuf.ToArray(); + deencapsulator.PushPacket(completeBbframe); + outbuf = new MemoryStream(); + } + + //Start indicaator + outbuf.Write(packets, 8, packets[7]); + } + else + { + outbuf.Write(packets, 9, packets[7] - 1); + } + /*if ((packets[8] & 0xff) == 0xb8) { if (outbuf != null) { byte[] chi = outbuf.ToArray(); - if (deencapsulator == null) - { - deencapsulator = new BbframeDeencapsulator(); - deencapsulator.MpeEventHandler = mpeEventHandler; - deencapsulator.PID = pid; - } - deencapsulator.PushPacket(chi); } outbuf = new MemoryStream(); @@ -54,7 +70,7 @@ namespace skyscraper8.GSE { if (outbuf != null) outbuf.Write(packets, 9, packets[7] - 1); - } + }*/ } } } diff --git a/skyscraper8/Program.cs b/skyscraper8/Program.cs index e827496..0b42bd6 100644 --- a/skyscraper8/Program.cs +++ b/skyscraper8/Program.cs @@ -29,6 +29,7 @@ using System.Runtime.InteropServices; using skyscraper5.Mpeg2.Descriptors; using skyscraper5.Skyscraper.Scraper.StreamAutodetection; using skyscraper8; +using skyscraper8.GSE; using skyscraper8.SatIp; using skyscraper8.SatIp.RtspResponses; using skyscraper8.SimpleServiceDiscoveryProtocol; @@ -306,6 +307,13 @@ namespace skyscraper5 TogglePcapConfiguration(2); return; } + + if (args[0].ToLowerInvariant().Equals("pts2bbf")) + { + FileInfo fi = new FileInfo(args[1]); + Pts2Bbf.Run(fi); + return; + } } /*Passing passing = new Passing(); diff --git a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs index 296c47d..82b878e 100644 --- a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs +++ b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs @@ -299,11 +299,14 @@ namespace skyscraper5.Skyscraper.Scraper } if (buffer[0] == 0x47 && buffer[1] == 0x41 && buffer[2] == 0x0e && (buffer[3] & 0x10) != 0 && buffer[4] == 0x00 && buffer[5] == 0x80 && buffer[6] == 0x00) { - DvbContext.RegisterPacketProcessor(0x010e, new Stid135BbFrameReader(this)); - UiJunction?.SetGseMode(); - LogEvent(SkyscraperContextEvent.SpecialTsMode, "STiD135 encapsulated GS detected."); - SpecialTsType = 3; - } + if (!DvbContext.IsPidProcessorPresent(0x010e)) + { + DvbContext.RegisterPacketProcessor(0x010e, new Stid135BbFrameReader(this)); + UiJunction?.SetGseMode(); + LogEvent(SkyscraperContextEvent.SpecialTsMode, "STiD135 encapsulated GS detected."); + SpecialTsType = 3; + } + } firstPacketDone = true; }