From bc4562cd526e4eda4f6575fc1c6bb4ad1af300aa Mon Sep 17 00:00:00 2001 From: feyris-tan <4116042+feyris-tan@users.noreply.github.com> Date: Tue, 27 May 2025 21:41:15 +0200 Subject: [PATCH] Made the Astra SDT channel work. --- .gitignore | 1 + skyscraper8.Tests/AssemblySettings.cs | 1 + .../AstraBarkerTransponderTests.cs | 61 ++++++++++++++++++ .../AsraBarkerTransponderTests/DummyFilter.cs | 18 ++++++ skyscraper8.Tests/DocsisTests.cs | 20 +++++- .../Properties/Resources.Designer.cs | 10 +++ skyscraper8.Tests/Properties/Resources.resx | 3 + ..._V4_MultipartRegistrationResponseTest2.bin | Bin 0 -> 684 bytes .../Docsis/AnnexC/CommonTlvEncodings.cs | 6 ++ .../T45_V4_MultipartRegistrationResponse.cs | 1 + skyscraper8/Mpeg2/TsDescriptorUnpacker.cs | 2 +- skyscraper8/Properties/launchSettings.json | 2 +- .../Contestants/Pid0x11Contestant.cs | 24 +++++-- .../Contestants/SdtContestant.cs | 4 +- 14 files changed, 142 insertions(+), 11 deletions(-) create mode 100644 skyscraper8.Tests/AssemblySettings.cs create mode 100644 skyscraper8.Tests/AstraBarkerTransponderTests.cs create mode 100644 skyscraper8.Tests/ClassDependencies/AsraBarkerTransponderTests/DummyFilter.cs create mode 100644 skyscraper8.Tests/Resources/T45_V4_MultipartRegistrationResponseTest2.bin diff --git a/.gitignore b/.gitignore index 16b61a6..5773706 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,4 @@ imgui.ini /skyscraper8/bin/Debug/net8.0 /skyscraper8/obj /GUIs/skyscraper8.UI.ImGui/bin/Debug/net8.0/skyscraper5.ini +/.vs/skyscraper8/CopilotIndices/17.14.698.11175 diff --git a/skyscraper8.Tests/AssemblySettings.cs b/skyscraper8.Tests/AssemblySettings.cs new file mode 100644 index 0000000..7f777c3 --- /dev/null +++ b/skyscraper8.Tests/AssemblySettings.cs @@ -0,0 +1 @@ +[assembly: CollectionBehavior(DisableTestParallelization = true)] \ No newline at end of file diff --git a/skyscraper8.Tests/AstraBarkerTransponderTests.cs b/skyscraper8.Tests/AstraBarkerTransponderTests.cs new file mode 100644 index 0000000..9cadf09 --- /dev/null +++ b/skyscraper8.Tests/AstraBarkerTransponderTests.cs @@ -0,0 +1,61 @@ +using skyscraper5.Mpeg2; +using skyscraper5.Skyscraper.IO; +using skyscraper5.Skyscraper.Scraper.StreamAutodetection.Contestants; +using skyscraper8.Tests.ClassDependencies.AsraBarkerTransponderTests; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace skyscraper8.Tests +{ + public class AstraBarkerTransponderTests + { + private const string BARKER_TRANSPONDER_FILE_PATH = "Z:\\Freebies\\Datasets\\SkyscraperLibrarian\\DVB-S Mai 2025\\sgt-000000.ts"; + private Stream GetBarkerTransponder() + { + FileInfo fi = new FileInfo(BARKER_TRANSPONDER_FILE_PATH); + if (!fi.Exists) + { + Debug.WriteLine(String.Format("Could not find file: {0}", BARKER_TRANSPONDER_FILE_PATH)); + return null; + } + return fi.OpenRead(); + } + + [Fact] + public void TestAstraSdt() + { + Stream stream = GetBarkerTransponder(); + if (stream == null) + return; + + SdtContestant contestant = new SdtContestant(0x002d); + + TsDescriptorUnpacker descriptorUnpacker = TsDescriptorUnpacker.GetInstance(); + for (byte i = 0x80; i < 0xfe; i++) + { + descriptorUnpacker.SetUserDefined(i, true); + } + + descriptorUnpacker.SetUserDefined(0xfe, true); + + TsContext tsContext = new TsContext(); + tsContext.FilterChain = new List(); + tsContext.FilterChain.Add(new DummyFilter()); + tsContext.RegisterPacketProcessor(0x002d, contestant.PacketProcessor); + + byte[] buffer = new byte[188]; + while (stream.GetAvailableBytes() >= 188) + { + stream.Read(buffer, 0, 188); + tsContext.PushPacket(buffer); + if (contestant.Score >= 10) + break; + } + stream.Close(); + } + } +} diff --git a/skyscraper8.Tests/ClassDependencies/AsraBarkerTransponderTests/DummyFilter.cs b/skyscraper8.Tests/ClassDependencies/AsraBarkerTransponderTests/DummyFilter.cs new file mode 100644 index 0000000..adbec99 --- /dev/null +++ b/skyscraper8.Tests/ClassDependencies/AsraBarkerTransponderTests/DummyFilter.cs @@ -0,0 +1,18 @@ +using skyscraper5.Mpeg2; +using skyscraper5.src.Mpeg2.PacketFilter; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace skyscraper8.Tests.ClassDependencies.AsraBarkerTransponderTests +{ + internal class DummyFilter : IPacketFilter + { + public bool PassPacket(TsPacket packet) + { + return true; + } + } +} diff --git a/skyscraper8.Tests/DocsisTests.cs b/skyscraper8.Tests/DocsisTests.cs index 6faf0bd..6532ea9 100644 --- a/skyscraper8.Tests/DocsisTests.cs +++ b/skyscraper8.Tests/DocsisTests.cs @@ -46,8 +46,6 @@ namespace skyscraper8.Tests PhysicalAddress target = new PhysicalAddress(targetBuffer); byte[] buffer = Properties.Resources.MultipartRegistrationResponseTest; - - T45_V4_MultipartRegistrationResponse test = new T45_V4_MultipartRegistrationResponse(source, target, buffer); Assert.True(test.Valid); } @@ -98,5 +96,23 @@ namespace skyscraper8.Tests CommonTlvEncodingObject.TransmitChannelConfigurationObject child = new CommonTlvEncodingObject.TransmitChannelConfigurationObject(testPayload); Assert.True(child.Valid); } + + [Fact] + public void MultipartRegistrationResponse2() + { + Random rng = new Random(); + + byte[] sourceBuffer = new byte[6]; + rng.NextBytes(sourceBuffer); + PhysicalAddress source = new PhysicalAddress(sourceBuffer); + + byte[] targetBuffer = new byte[6]; + rng.NextBytes(targetBuffer); + PhysicalAddress target = new PhysicalAddress(targetBuffer); + + byte[] buffer = Properties.Resources.MultipartRegistrationResponseTest2; + T45_V4_MultipartRegistrationResponse test = new T45_V4_MultipartRegistrationResponse(source, target, buffer); + Assert.True(test.Valid); + } } } diff --git a/skyscraper8.Tests/Properties/Resources.Designer.cs b/skyscraper8.Tests/Properties/Resources.Designer.cs index f36aaee..e70c8f6 100644 --- a/skyscraper8.Tests/Properties/Resources.Designer.cs +++ b/skyscraper8.Tests/Properties/Resources.Designer.cs @@ -80,6 +80,16 @@ namespace skyscraper8.Tests.Properties { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. + /// + internal static byte[] MultipartRegistrationResponseTest2 { + get { + object obj = ResourceManager.GetObject("MultipartRegistrationResponseTest2", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. /// diff --git a/skyscraper8.Tests/Properties/Resources.resx b/skyscraper8.Tests/Properties/Resources.resx index b384543..927ac85 100644 --- a/skyscraper8.Tests/Properties/Resources.resx +++ b/skyscraper8.Tests/Properties/Resources.resx @@ -130,6 +130,9 @@ ..\Resources\ranging_response_test.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\T45_V4_MultipartRegistrationResponseTest2.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\Resources\test-1packet-01.ts;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/skyscraper8.Tests/Resources/T45_V4_MultipartRegistrationResponseTest2.bin b/skyscraper8.Tests/Resources/T45_V4_MultipartRegistrationResponseTest2.bin new file mode 100644 index 0000000000000000000000000000000000000000..e1cf0b86bda3d21680417e55e5757ccba8b26a47 GIT binary patch literal 684 zcmY+;KPbd;7{~GFdA`5j@7%vAejVpe$3SN|iZdy9EKEw>D8)e8Sd_uP0Rxi=lcFS9 zkS^JD7PpWXECyM0gGr7%-{8Q%D0EnsYO+XRBz#WG7`axMg^@$4Rru806VaUVT|Jm zo>PqCl%cG0JjGB@DS~;604fP0p`fLo34T`T4cWF!`-36dacM)3*QF&rK9{ET_+1*+ z6L4urPtc{_!B{z>Lr4n2i(NjvZd*Z1|NoSF5P^J%NYwJB^k|b|W!N$t73)ChBM#(^ zfS3bf4v0Cx{=4Mt-zDEhNX#KIhr}Ez*}UY(2#7f#=75+3?7vGc{#{ZqLShbyIV9## V$>t?RBOvC0m;+)CusaF5e*xCkY6$=U literal 0 HcmV?d00001 diff --git a/skyscraper8/Docsis/AnnexC/CommonTlvEncodings.cs b/skyscraper8/Docsis/AnnexC/CommonTlvEncodings.cs index 5c47e61..279c14c 100644 --- a/skyscraper8/Docsis/AnnexC/CommonTlvEncodings.cs +++ b/skyscraper8/Docsis/AnnexC/CommonTlvEncodings.cs @@ -72,6 +72,10 @@ namespace skyscraper5.Docsis.AnnexC DsidEncodings = new List(); DsidEncodings.Add(new DsidEncoding(v)); break; + case 52: + (v[0], v[1]) = (v[1], v[0]); + InitializingChannelTimeout = new TimeSpan(0, 0, BitConverter.ToUInt16(v)); + break; default: //CM-SP-MULPIv4.0-I01-190815.pdf page 652 throw new NotImplementedException(string.Format("Common TLV Encodings Type {0}", type)); @@ -155,6 +159,7 @@ namespace skyscraper5.Docsis.AnnexC public InitalizationTechniqueEnum? InitializationTechnique { get; } public UpstreamChannelDescriptor UpstreamChannelDescriptor { get; } public byte DynamicRangeWindow { get; } + public byte P16Hi { get; } } public byte KeySequenceNumber { get; set; } @@ -167,5 +172,6 @@ namespace skyscraper5.Docsis.AnnexC public RcpIdEncoding RcpId { get; private set; } public AuthorizationBlock AuthorizationHint { get; } public List DsidEncodings { get; private set; } + public TimeSpan InitializingChannelTimeout { get; } } } diff --git a/skyscraper8/Docsis/MacManagement/T45_V4_MultipartRegistrationResponse.cs b/skyscraper8/Docsis/MacManagement/T45_V4_MultipartRegistrationResponse.cs index 11a6c11..1a1f80c 100644 --- a/skyscraper8/Docsis/MacManagement/T45_V4_MultipartRegistrationResponse.cs +++ b/skyscraper8/Docsis/MacManagement/T45_V4_MultipartRegistrationResponse.cs @@ -12,6 +12,7 @@ namespace skyscraper5.Docsis.MacManagement { public T45_V4_MultipartRegistrationResponse(PhysicalAddress source, PhysicalAddress destination, byte[] buffer) : base(source, destination, buffer) { + File.WriteAllBytes("T45_V4_MultipartRegistrationResponseTest.bin", buffer); MemoryStream ms = new MemoryStream(buffer, false); SID = ms.ReadUInt16BE(); Response = ms.ReadUInt8(); diff --git a/skyscraper8/Mpeg2/TsDescriptorUnpacker.cs b/skyscraper8/Mpeg2/TsDescriptorUnpacker.cs index e2dc04d..899c181 100644 --- a/skyscraper8/Mpeg2/TsDescriptorUnpacker.cs +++ b/skyscraper8/Mpeg2/TsDescriptorUnpacker.cs @@ -12,7 +12,7 @@ using ExtensionDescriptor = skyscraper5.Dvb.ExtensionDescriptor; namespace skyscraper5.Mpeg2 { - class TsDescriptorUnpacker + public class TsDescriptorUnpacker { private const bool CRASH_ON_UNIMPLEMENTED_DESCRIPTOR = true; private static TsDescriptorUnpacker _instance; diff --git a/skyscraper8/Properties/launchSettings.json b/skyscraper8/Properties/launchSettings.json index 09f259f..9a9887f 100644 --- a/skyscraper8/Properties/launchSettings.json +++ b/skyscraper8/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "skyscraper8": { "commandName": "Project", - "commandLineArgs": "\"D:\\\\DocsisDemo\\\\docsis-000575.ts\"", + "commandLineArgs": "\"Z:\\Freebies\\Datasets\\SkyscraperLibrarian\\DVB-S Mai 2025\\sgt-000000.ts\"", "remoteDebugEnabled": false }, "Container (Dockerfile)": { diff --git a/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/Pid0x11Contestant.cs b/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/Pid0x11Contestant.cs index 0c927fc..2ba181a 100644 --- a/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/Pid0x11Contestant.cs +++ b/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/Pid0x11Contestant.cs @@ -20,18 +20,21 @@ namespace skyscraper5.Skyscraper.Scraper.StreamAutodetection.Contestants public void OnBatBouquet(BatBouquet batBouquet) { - Score++; + hasBat = true; + CheckAchievement(); } public void OnBatTransportStream(BatBouquet batBouquet, BatTransportStream child) { - Score++; - } + hasBat = true; + CheckAchievement(); + } public void OnSdtService(ushort transportStreamId, ushort originalNetworkId, SdtService sdtService) { - Score++; - } + hasSdt = true; + CheckAchievement(); + } public override void Dispose() { @@ -51,5 +54,16 @@ namespace skyscraper5.Skyscraper.Scraper.StreamAutodetection.Contestants public void SetTransportStreamId(ushort transportStreamId) { } + + private bool hasBat, hasSdt; + private void CheckAchievement() + { + if (hasBat && hasSdt) + { + Score++; + hasBat = false; + hasSdt = false; + } + } } } diff --git a/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/SdtContestant.cs b/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/SdtContestant.cs index 3089535..39717f9 100644 --- a/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/SdtContestant.cs +++ b/skyscraper8/Skyscraper/Scraper/StreamAutodetection/Contestants/SdtContestant.cs @@ -11,7 +11,7 @@ using skyscraper5.Skyscraper.Plugins; namespace skyscraper5.Skyscraper.Scraper.StreamAutodetection.Contestants { [SkyscraperPlugin] - class SdtContestant : Contestant, ISdtEventHandler, IDisposable + public class SdtContestant : Contestant, ISdtEventHandler, IDisposable { public SdtContestant(int pid) : base("SDT", pid) { @@ -30,7 +30,7 @@ namespace skyscraper5.Skyscraper.Scraper.StreamAutodetection.Contestants public override void DeclareWinner(SkyscraperContext skyscraperContext, int pid, ProgramContext programContext) { - throw new NotImplementedException(); + skyscraperContext.DvbContext.RegisterPacketProcessor(pid, new PsiDecoder(pid, new SdtParser(skyscraperContext))); } public void SetNetworkId(ushort networkId)