Compare commits

...

2 Commits

Author SHA1 Message Date
ft
90ac87770d Merge pull request 'As a small exercise, made the output of Stid135BbFrameReader bit-identical to the one of pts2bbf.cpp' (#1) from pts2bbf into master
All checks were successful
🚀 Pack skyscraper8 / make-zip (push) Successful in 1m32s
Reviewed-on: #1
2025-10-14 09:59:05 +00:00
feyris-tan
7630775d55 As a small exercise, made the output of Stid135BbFrameReader bit-identical to the one of pts2bbf.cpp
All checks were successful
🚀 Pack skyscraper8 / make-zip (push) Successful in 1m53s
2025-10-14 11:51:50 +02:00
10 changed files with 129 additions and 16 deletions

View File

@ -1,2 +1,3 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AFileInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fe1ab690537c44e02a014076312b886b7b2e200_003F5a_003Fcf76af61_003FFileInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/Profiling/Configurations/=1/@EntryIndexedValue">&lt;data&gt;&lt;HostParameters type="LocalHostParameters" /&gt;&lt;Argument type="StandaloneArgument"&gt;&lt;Arguments IsNull="False"&gt;&lt;/Arguments&gt;&lt;FileName IsNull="False"&gt;&lt;/FileName&gt;&lt;WorkingDirectory IsNull="False"&gt;&lt;/WorkingDirectory&gt;&lt;Scope&gt;&lt;ProcessFilters /&gt;&lt;/Scope&gt;&lt;/Argument&gt;&lt;Info type="TimelineInfo" /&gt;&lt;CoreOptions type="CoreOptions"&gt;&lt;CoreTempPath IsNull="False"&gt;&lt;/CoreTempPath&gt;&lt;RemoteEndPoint IsNull="False"&gt;&lt;/RemoteEndPoint&gt;&lt;AdditionalEnvironmentVariables /&gt;&lt;/CoreOptions&gt;&lt;HostOptions type="HostOptions"&gt;&lt;HostTempPath IsNull="False"&gt;&lt;/HostTempPath&gt;&lt;/HostOptions&gt;&lt;/data&gt;</s:String></wpf:ResourceDictionary>

View File

@ -13,7 +13,7 @@ using log4net;
namespace skyscraper8.GSE
{
internal class BbframeDeencapsulator
internal class BbframeDeencapsulator : IBbframeDeencapsulator
{
private bool interruptedGseHem;
private MemoryStream interruptedGseHemBuffer;

View File

@ -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();
}
}

View File

@ -0,0 +1,6 @@
namespace skyscraper8.GSE;
public interface IBbframeDeencapsulator
{
public void PushPacket(byte[] bbframe);
}

View File

@ -0,0 +1,16 @@
using skyscraper5.Skyscraper;
namespace skyscraper8.GSE;
public class NullGsEventHandler : IGsEventHandler
{
public void OnIpDatagram(int pid, byte[] payload)
{
}
public void GsIpTrafficDetected()
{
}
}

View File

@ -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");
}
}

View File

@ -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);
}
}*/
}
}
}

View File

@ -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();

View File

@ -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;
}