From 799f36dba8ee8cab1229d9077b964df74512beaa Mon Sep 17 00:00:00 2001 From: feyris-tan <4116042+feyris-tan@users.noreply.github.com> Date: Fri, 17 Oct 2025 23:14:26 +0200 Subject: [PATCH] The GS of Siminn Radiomidun can now get read. --- skyscraper8/GS/GsTypeDetector.cs | 15 +++ .../SiminnRadiomidunReader.cs | 95 +++++++++++++++++++ skyscraper8/Properties/launchSettings.json | 2 +- 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 skyscraper8/GS/SiminnRadiomidun/SiminnRadiomidunReader.cs diff --git a/skyscraper8/GS/GsTypeDetector.cs b/skyscraper8/GS/GsTypeDetector.cs index bd67e56..d692b32 100644 --- a/skyscraper8/GS/GsTypeDetector.cs +++ b/skyscraper8/GS/GsTypeDetector.cs @@ -1,5 +1,6 @@ using log4net; using skyscraper5.Dvb.DataBroadcasting; +using skyscraper8.GS.SiminnRadiomidun; using skyscraper8.GSE.GSE_HEM; using skyscraper8.GSE.GSE; @@ -19,6 +20,7 @@ public class GsTypeDetector : IMisHandler private GseReader gseReader; private GseHemReader gseHemReader; + private SiminnRadiomidunReader siminnRadiomidunReader; public void PushFrame(BBHeader bbHeader, ReadOnlySpan readOnlySpan) { if (readOnlySpan.Length == 0) @@ -49,6 +51,19 @@ public class GsTypeDetector : IMisHandler gseHemReader.PushFrame(bbHeader, readOnlySpan); return; } + + if (bbHeader.TsGs == 0 && bbHeader.SyncByte == 71 && bbHeader.UserPacketLength == 188) + { + //Looks like a Simmin Radiomidun-like stream. + if (siminnRadiomidunReader == null) + { + //These behave similar to T2-MI. Interesting. + siminnRadiomidunReader = new SiminnRadiomidunReader(); + } + + siminnRadiomidunReader.PushFrame(bbHeader, readOnlySpan); + return; + } //We have no idea what this is. Tuple streamTypeToPost = new Tuple(bbHeader.TsGs, bbHeader.SyncByte); diff --git a/skyscraper8/GS/SiminnRadiomidun/SiminnRadiomidunReader.cs b/skyscraper8/GS/SiminnRadiomidun/SiminnRadiomidunReader.cs new file mode 100644 index 0000000..f446e1c --- /dev/null +++ b/skyscraper8/GS/SiminnRadiomidun/SiminnRadiomidunReader.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using skyscraper5.Mpeg2.Descriptors; +using skyscraper5.Skyscraper.IO; +using skyscraper5.T2MI; +using skyscraper8.GSE; + +namespace skyscraper8.GS.SiminnRadiomidun +{ + internal class SiminnRadiomidunReader : IMisHandler + { + public SiminnRadiomidunReader() + { + packetQueue = new Queue>(); + isInSync = false; + } + + private bool isInSync; + private Queue> packetQueue; + private MemoryStream currentItem; + + public long PacketQueueSize + { + get + { + if (packetQueue == null) + return 0; + + return packetQueue.Select(x => x.Item2.Length).Sum(); + } + } + public void PushFrame(BBHeader bbHeader, ReadOnlySpan readOnlySpan) + { + if (packetQueue == null) + packetQueue = new Queue>(); + + packetQueue.Enqueue(new Tuple(bbHeader,new MemoryStream(readOnlySpan.Slice(0,bbHeader.DataFieldLength).ToArray(), true))); + + while (PacketQueueSize > 8192) + { + if (!isInSync) + { + Tuple dequeue = packetQueue.Dequeue(); + currentItem = dequeue.Item2; + currentItem.Position = dequeue.Item1.SyncD; + isInSync = true; + } + + byte[] outputPacketBuffer = new byte[188]; + int result = currentItem.Read(outputPacketBuffer, 0, 188); + if (result == 188) + { + OutputPacket(outputPacketBuffer); + } + else + { + int bytesNeeded = 188 - result; + Tuple dequeue = packetQueue.Dequeue(); + if (bytesNeeded == dequeue.Item1.SyncD) + { + //We're still in sync! + syncSucess++; + currentItem = dequeue.Item2; + currentItem.Read(outputPacketBuffer, result, bytesNeeded); + OutputPacket(outputPacketBuffer); + } + else + { + //sync loss, let's discard the packet + syncFail++; + currentItem = dequeue.Item2; + currentItem.Position = dequeue.Item1.SyncD; + } + } + } + } + + private ulong syncSucess, syncFail; + private FileStream dumpingFileStream; + private void OutputPacket(byte[] buffer) + { + buffer[0] = 0x47; + if (dumpingFileStream == null) + { + FileInfo fi = new FileInfo(string.Format("{0}.ts", DateTime.Now.Ticks)); + dumpingFileStream = fi.OpenWrite(); + } + + dumpingFileStream.Write(buffer, 0, 188); + } + } +} diff --git a/skyscraper8/Properties/launchSettings.json b/skyscraper8/Properties/launchSettings.json index db520cf..d2912aa 100644 --- a/skyscraper8/Properties/launchSettings.json +++ b/skyscraper8/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "skyscraper8": { "commandName": "Project", - "commandLineArgs": "udpin udp://172.20.20.130:6969", + "commandLineArgs": "C:\\devel\\skyscraper8\\skyscraper8\\bin\\Debug\\net8.0\\11049v.ts", "remoteDebugEnabled": false }, "Container (Dockerfile)": {