From c03d4238bf839ab543847597be4f6335d0bc8401 Mon Sep 17 00:00:00 2001 From: feyris-tan Date: Tue, 4 Nov 2025 16:21:01 +0100 Subject: [PATCH 1/4] 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]); From 5745cf0421583de1158167f34c41bb2869fbc60d Mon Sep 17 00:00:00 2001 From: feyris-tan Date: Tue, 4 Nov 2025 16:36:00 +0100 Subject: [PATCH 2/4] Detect HTTP traffic in Packages. --- skyscraper8/GS/POC/Pts2Bbf2.cs | 14 ++++++++++++-- skyscraper8/Skyscraper/IpPacketFinder.cs | 12 ++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/skyscraper8/GS/POC/Pts2Bbf2.cs b/skyscraper8/GS/POC/Pts2Bbf2.cs index e3b113f..3d40ced 100644 --- a/skyscraper8/GS/POC/Pts2Bbf2.cs +++ b/skyscraper8/GS/POC/Pts2Bbf2.cs @@ -1,4 +1,6 @@ +using log4net; using skyscraper5.Mpeg2; +using skyscraper5.Skyscraper; using skyscraper5.Skyscraper.IO; using skyscraper5.Skyscraper.Scraper; using skyscraper5.Skyscraper.Scraper.Storage.InMemory; @@ -8,6 +10,7 @@ namespace skyscraper8.GSE; public class Pts2Bbf2 : IBbframeDeencapsulator { + private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name); private readonly FileInfo _fi; private readonly DirectoryInfo outputDir; @@ -45,8 +48,15 @@ public class Pts2Bbf2 : IBbframeDeencapsulator 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); + + string outfname = Path.Combine(outputDir.FullName, fname); ReadOnlySpan readOnlySpan = new ReadOnlySpan(bbframe, 11, bbframe.Length - 11); - File.WriteAllBytes(fname, readOnlySpan.ToArray()); + byte[] buffer = readOnlySpan.ToArray(); + File.WriteAllBytes(outfname, buffer); + + if (IpPacketFinder.TestForHttpContents(buffer)) + { + logger.InfoFormat("Found unencrypted HTTP traffic in {0}", fname); + } } } \ No newline at end of file diff --git a/skyscraper8/Skyscraper/IpPacketFinder.cs b/skyscraper8/Skyscraper/IpPacketFinder.cs index ea64f8d..65a02cb 100644 --- a/skyscraper8/Skyscraper/IpPacketFinder.cs +++ b/skyscraper8/Skyscraper/IpPacketFinder.cs @@ -86,5 +86,17 @@ namespace skyscraper5.Skyscraper return result; } + + public static bool TestForHttpContents(byte[] buffer) + { + for (int i = 0; i < buffer.Length - 5; i++) + if (buffer[i] == 0x48) + if (buffer[i + 1] == 0x54) + if (buffer[i + 2] == 0x54) + if (buffer[i + 3] == 0x50) + if (buffer[i + 4] == 0x2f) + return true; + return false; + } } } From 980cec03323c0405f8e6f5083ff3605da7a00829 Mon Sep 17 00:00:00 2001 From: feyris-tan Date: Thu, 6 Nov 2025 15:34:56 +0100 Subject: [PATCH 3/4] Added sanity tests for BFBS BBFrames --- skyscraper8.Tests/GsType1SanityTest.cs | 21 ++++ .../Properties/Resources.Designer.cs | 103 ++++++------------ skyscraper8.Tests/Properties/Resources.resx | 6 + .../Frame00000008_TSGS1_MIS000_SYNC001.bbf | Bin 0 -> 6041 bytes .../Frame00001343_TSGS1_MIS000_SYNC001.bbf | Bin 0 -> 3206 bytes skyscraper8.sln.DotSettings.user | 10 ++ skyscraper8/Mpeg2/Crc32.cs | 2 +- 7 files changed, 74 insertions(+), 68 deletions(-) create mode 100644 skyscraper8.Tests/GsType1SanityTest.cs create mode 100644 skyscraper8.Tests/Resources/Frame00000008_TSGS1_MIS000_SYNC001.bbf create mode 100644 skyscraper8.Tests/Resources/Frame00001343_TSGS1_MIS000_SYNC001.bbf diff --git a/skyscraper8.Tests/GsType1SanityTest.cs b/skyscraper8.Tests/GsType1SanityTest.cs new file mode 100644 index 0000000..77086ab --- /dev/null +++ b/skyscraper8.Tests/GsType1SanityTest.cs @@ -0,0 +1,21 @@ +using skyscraper5.Mpeg2; +using skyscraper8.Tests.Properties; + +namespace skyscraper8.Tests; + +public class GsType1SanityTest +{ + [Fact] + public void CheckBfbsCrc() + { + byte[] blob = Resources.Frame00001343_TSGS1_MIS000_SYNC001; + MemoryStream ms = new MemoryStream(blob, false); + bool result = DvbCrc32.ValidateCrc(ms, 0, (int)ms.Length); + Assert.True(result); + + blob = Resources.Frame00000008_TSGS1_MIS000_SYNC001; + ms = new MemoryStream(blob, false); + result = DvbCrc32.ValidateCrc(ms, 0, (int)ms.Length); + Assert.True(result); + } +} \ No newline at end of file diff --git a/skyscraper8.Tests/Properties/Resources.Designer.cs b/skyscraper8.Tests/Properties/Resources.Designer.cs index e70c8f6..72d011c 100644 --- a/skyscraper8.Tests/Properties/Resources.Designer.cs +++ b/skyscraper8.Tests/Properties/Resources.Designer.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.42000 +// This code was generated by a tool. // -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // //------------------------------------------------------------------------------ @@ -12,46 +11,32 @@ namespace skyscraper8.Tests.Properties { using System; - /// - /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. - /// - // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert - // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. - // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen - // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { - private static global::System.Resources.ResourceManager resourceMan; + private static System.Resources.ResourceManager resourceMan; - private static global::System.Globalization.CultureInfo resourceCulture; + private static System.Globalization.CultureInfo resourceCulture; - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } - /// - /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager { get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("skyscraper8.Tests.Properties.Resources", typeof(Resources).Assembly); + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("skyscraper8.Tests.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - /// - /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle - /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -60,9 +45,6 @@ namespace skyscraper8.Tests.Properties { } } - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// internal static byte[] ModemCapabilitiesEncodingTest { get { object obj = ResourceManager.GetObject("ModemCapabilitiesEncodingTest", resourceCulture); @@ -70,9 +52,6 @@ namespace skyscraper8.Tests.Properties { } } - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// internal static byte[] MultipartRegistrationResponseTest { get { object obj = ResourceManager.GetObject("MultipartRegistrationResponseTest", resourceCulture); @@ -80,19 +59,6 @@ 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[]. - /// internal static byte[] PushMacManagementMessage_Version4_Type45 { get { object obj = ResourceManager.GetObject("PushMacManagementMessage_Version4_Type45", resourceCulture); @@ -100,9 +66,6 @@ namespace skyscraper8.Tests.Properties { } } - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// internal static byte[] ranging_response_test { get { object obj = ResourceManager.GetObject("ranging_response_test", resourceCulture); @@ -110,9 +73,13 @@ 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)); + } + } + internal static byte[] test_1packet_01 { get { object obj = ResourceManager.GetObject("test-1packet-01", resourceCulture); @@ -120,9 +87,6 @@ namespace skyscraper8.Tests.Properties { } } - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// internal static byte[] test_2packets_02_03 { get { object obj = ResourceManager.GetObject("test-2packets-02-03", resourceCulture); @@ -130,9 +94,6 @@ namespace skyscraper8.Tests.Properties { } } - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// internal static byte[] test_3packets_04_05_06 { get { object obj = ResourceManager.GetObject("test-3packets-04-05-06", resourceCulture); @@ -140,9 +101,6 @@ namespace skyscraper8.Tests.Properties { } } - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// internal static byte[] TransmitChannelConfigurationObject { get { object obj = ResourceManager.GetObject("TransmitChannelConfigurationObject", resourceCulture); @@ -150,14 +108,25 @@ namespace skyscraper8.Tests.Properties { } } - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// internal static byte[] UpstreamChannelDescriptorTest { get { object obj = ResourceManager.GetObject("UpstreamChannelDescriptorTest", resourceCulture); return ((byte[])(obj)); } } + + internal static byte[] Frame00001343_TSGS1_MIS000_SYNC001 { + get { + object obj = ResourceManager.GetObject("Frame00001343_TSGS1_MIS000_SYNC001", resourceCulture); + return ((byte[])(obj)); + } + } + + internal static byte[] Frame00000008_TSGS1_MIS000_SYNC001 { + get { + object obj = ResourceManager.GetObject("Frame00000008_TSGS1_MIS000_SYNC001", resourceCulture); + return ((byte[])(obj)); + } + } } } diff --git a/skyscraper8.Tests/Properties/Resources.resx b/skyscraper8.Tests/Properties/Resources.resx index 927ac85..8bdd6b7 100644 --- a/skyscraper8.Tests/Properties/Resources.resx +++ b/skyscraper8.Tests/Properties/Resources.resx @@ -148,4 +148,10 @@ ..\Resources\UpstreamChannelDescriptorTest.bin;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\Frame00001343_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\Frame00000008_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/skyscraper8.Tests/Resources/Frame00000008_TSGS1_MIS000_SYNC001.bbf b/skyscraper8.Tests/Resources/Frame00000008_TSGS1_MIS000_SYNC001.bbf new file mode 100644 index 0000000000000000000000000000000000000000..9e6a78c0240b3a9adf29aac812395486f90b5bb2 GIT binary patch literal 6041 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 sTnv>oFigb*1`HT5V8DQZuYsPe0}#;xy#N3J literal 0 HcmV?d00001 diff --git a/skyscraper8.sln.DotSettings.user b/skyscraper8.sln.DotSettings.user index 3f27e6a..ebe4749 100644 --- a/skyscraper8.sln.DotSettings.user +++ b/skyscraper8.sln.DotSettings.user @@ -10,4 +10,14 @@ ForceIncluded ForceIncluded ForceIncluded + <SessionState ContinuousTestingMode="0" IsActive="True" Name="CheckBfbsCrc #2" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>xUnit::84EE9FCD-2C7F-DF84-C1BA-99D018CE9412::net8.0::skyscraper8.Tests.GsType1SanityTest.CheckBfbsCrc</TestId> + </TestAncestor> +</SessionState> + <SessionState ContinuousTestingMode="0" Name="CheckBfbsCrc" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <TestAncestor> + <TestId>xUnit::84EE9FCD-2C7F-DF84-C1BA-99D018CE9412::net8.0::skyscraper8.Tests.GsType1SanityTest.CheckBfbsCrc</TestId> + </TestAncestor> +</SessionState> <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/Mpeg2/Crc32.cs b/skyscraper8/Mpeg2/Crc32.cs index 3c896f9..4e8bd75 100644 --- a/skyscraper8/Mpeg2/Crc32.cs +++ b/skyscraper8/Mpeg2/Crc32.cs @@ -4,7 +4,7 @@ using static System.Collections.Specialized.BitVector32; namespace skyscraper5.Mpeg2 { - internal class DvbCrc32 + public class DvbCrc32 { private DvbCrc32() { From 781636e0a35fa4e3608178ba3273f514f1d86f2f Mon Sep 17 00:00:00 2001 From: feyris-tan Date: Thu, 6 Nov 2025 16:04:55 +0100 Subject: [PATCH 4/4] Added a further BFBS Test. --- skyscraper8.Tests/AstraBarkerTransponderTests.cs | 6 ++---- skyscraper8.Tests/GsType1SanityTest.cs | 10 ++++++++++ .../Properties/Resources.Designer.cs | 7 +++++++ skyscraper8.Tests/Properties/Resources.resx | 3 +++ .../Frame00000012_TSGS1_MIS000_SYNC001.bbf | Bin 0 -> 3206 bytes skyscraper8.Tests/SanityTests.cs | 2 ++ skyscraper8.Tests/TsDuckTestPatterns.cs | 6 +++++- skyscraper8.Tests/UselessCodeCoverageTests.cs | 13 +++++++++++++ skyscraper8.sln.DotSettings.user | 5 ++--- skyscraper8/Mpeg2/Crc32.cs | 14 ++++++++++++++ .../Scraper/Storage/NullObjectStorage.cs | 2 +- 11 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 skyscraper8.Tests/Resources/Frame00000012_TSGS1_MIS000_SYNC001.bbf create mode 100644 skyscraper8.Tests/UselessCodeCoverageTests.cs diff --git a/skyscraper8.Tests/AstraBarkerTransponderTests.cs b/skyscraper8.Tests/AstraBarkerTransponderTests.cs index 9f12657..f0ed3fc 100644 --- a/skyscraper8.Tests/AstraBarkerTransponderTests.cs +++ b/skyscraper8.Tests/AstraBarkerTransponderTests.cs @@ -30,8 +30,7 @@ namespace skyscraper8.Tests public void TestAstraSdt() { Stream stream = GetBarkerTransponder(); - if (stream == null) - return; + Skip.If(stream == null, "Barker Transponder stream not available."); SdtContestant contestant = new SdtContestant(0x002d); @@ -62,8 +61,7 @@ namespace skyscraper8.Tests public void TestAstraLcn() { Stream stream = GetBarkerTransponder(); - if (stream == null) - return; + Skip.If(stream == null, "Barker Transponder stream not available."); SgtCandidate contestant = new SgtCandidate(0x0777); SgtCandidate contestant2 = new SgtCandidate(0x0776); diff --git a/skyscraper8.Tests/GsType1SanityTest.cs b/skyscraper8.Tests/GsType1SanityTest.cs index 77086ab..fbc2889 100644 --- a/skyscraper8.Tests/GsType1SanityTest.cs +++ b/skyscraper8.Tests/GsType1SanityTest.cs @@ -1,3 +1,4 @@ +using System.Reflection; using skyscraper5.Mpeg2; using skyscraper8.Tests.Properties; @@ -18,4 +19,13 @@ public class GsType1SanityTest result = DvbCrc32.ValidateCrc(ms, 0, (int)ms.Length); Assert.True(result); } + + [Fact] + public void CheckBfbsCrcSpan() + { + byte[] blob = Resources.Frame00000012_TSGS1_MIS000_SYNC001; + ReadOnlySpan span = new ReadOnlySpan(blob); + bool result = DvbCrc32.ValidateCrc(span); + Assert.True(result); + } } \ No newline at end of file diff --git a/skyscraper8.Tests/Properties/Resources.Designer.cs b/skyscraper8.Tests/Properties/Resources.Designer.cs index 72d011c..f385bb9 100644 --- a/skyscraper8.Tests/Properties/Resources.Designer.cs +++ b/skyscraper8.Tests/Properties/Resources.Designer.cs @@ -128,5 +128,12 @@ namespace skyscraper8.Tests.Properties { return ((byte[])(obj)); } } + + internal static byte[] Frame00000012_TSGS1_MIS000_SYNC001 { + get { + object obj = ResourceManager.GetObject("Frame00000012_TSGS1_MIS000_SYNC001", resourceCulture); + return ((byte[])(obj)); + } + } } } diff --git a/skyscraper8.Tests/Properties/Resources.resx b/skyscraper8.Tests/Properties/Resources.resx index 8bdd6b7..33cfa0a 100644 --- a/skyscraper8.Tests/Properties/Resources.resx +++ b/skyscraper8.Tests/Properties/Resources.resx @@ -154,4 +154,7 @@ ..\Resources\Frame00000008_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\Frame00000012_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/skyscraper8.Tests/Resources/Frame00000012_TSGS1_MIS000_SYNC001.bbf b/skyscraper8.Tests/Resources/Frame00000012_TSGS1_MIS000_SYNC001.bbf new file mode 100644 index 0000000000000000000000000000000000000000..eb5ee33f419253f6e69fb1824860f56b8f0385a8 GIT binary patch literal 3206 zcmeH}uYPj8PKO-IAlbWWvbtf(R0VBc)S7M3^ElQfeR|qlFPKT_P$W-7&g5 zhfWxI-}kxy!u@#9^PF$z%kO+R&l$y&1Bi$UAOOG#;2&v__I=JhnO39llI|jE8(wn) z8yE?rv~pq08360_e-qslw+BRV)5(R`n~ggsj=D)?3V7k#E1 zNJt=)6u}0Js*-mw7&i3K^9=4X?66klWrS3+^yC{~ApNlY70wBUd6%3ExB1bmw#&la zU6WL6*zB|Md0A4mwsYSP!*3VECa%e8sbb2$3sQXjlYQK{B+Lk&Yf+I6S1V5yu{Xl0 zaJ+;}Y5jvu90UQ7sQwpwz=STxEQ`WRxu2-*C(a4mwopLcCpJ~DSB!GKQNYnSK=9%pizr8gsXlGUg5f>p4enGS8-j1JpJ z+HFlxUDQg0>AK!YSn}$ii&r%e8G9u4gdbsM-dWQf-4b3CkH3cdWNgWO?SeSl_Jd^i zEvY1>U98W>%i%f7OljR#SM7&d|Ny3Ob8&{ z+Wzoeq`bqTtY9AJe`xEmU}AW_9@$cQ|FoPRlBA+ATo`5UOaBlZ)q9JBEFY^AsoLIR=&%rxTK z;goF9!EKCFNy7*$2?a;F6ylm*kgBdmgsTv~v{@5Hrqv51IFPYw-sYZxK!o=5XS>*~ zwDV75I6*6wRY#~HlN$xN&MPDaYyv9+za$Wz(6QL znywE^i~mM2ybjZQk8JQH^LKA$3MmYswUH0(W0r}gb(^xP^@-Pwfbq16FUgnub*BRnC+3%=1v}M zzP#8hL4Td$;^xunL{~$jvr@$AR?A0sB%@uDL`M!4^aA{k5b5SIH9#m`jMO;h`2$LR z&)G_U!KRBqLTPiOaJu#Ujx^CuBl&M_s>d*g@1zGi4HP}022G@Doh}|EZ>ZNl4GXxj zTrnsT99udqDP7zxQ?8SdKt z^*N?SI?++=sw6=g`?z)O6Rg?X67=TNRJ~xxYgG*6y2UEaPucEx%HlXrcwrvYxS%%- zle(czlcrSh76YC_)L%4A>yQ_HG7mV-_9!$2IQ_uw-KWm;z1Ld)3~9mtAg)q?H(>lU z?%d)%{FdkZ>qq1F?kT5D9}%pHJNR<-kuX(oxGxNceFD+1(yd7fr<}z7JE0s9z}*7? zktRUq9`;Zv`6PnEOD>J5Em7_+_LR(^Lj7V6H0zDrgOpb7UZGX3dF|3@vhQ}W-gP>8 zA=}QWD-xj{Qk9++(U!#q<~eRpR6qL}0n1y|m2`fhEMFJqcDG}3y$?dQ|qL%c9zMydhPUc`Y{9J3Y+ z^6ud44Vn$*Nh(UlbEb)8dM!rHAB-~Q9%xOM6Godv$Z)}Du{ zGk@}fSxqI1j%3aMM$U!%+j}Tw0#*A2E3>*%_38FlTondvI$ItoYVx}ye===raDUUbINk8J)tpq<&S=S6;K+VRtJWstIWmO5Fors36` zT#z=wXP`wGQ{2l9n`(ic-1-H+o!)MED&)V6j-@5oJ6*;UI$Vo}aXa_2 zj=q~caG>|Q)J44=KTE>@nSk{jKT4sw^`>)pR{p6~Em>y5W0GKkocmDp4pL=z;wzwy TJ<ForceIncluded ForceIncluded ForceIncluded + /home/schiemas/.cache/JetBrains/Rider2025.1/resharper-host/temp/Rider/vAny/CoverageData/_skyscraper8.1808907683/Snapshot/snapshot.utdcvr <SessionState ContinuousTestingMode="0" IsActive="True" Name="CheckBfbsCrc #2" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> - <TestAncestor> - <TestId>xUnit::84EE9FCD-2C7F-DF84-C1BA-99D018CE9412::net8.0::skyscraper8.Tests.GsType1SanityTest.CheckBfbsCrc</TestId> - </TestAncestor> + <Solution /> </SessionState> <SessionState ContinuousTestingMode="0" Name="CheckBfbsCrc" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> <TestAncestor> diff --git a/skyscraper8/Mpeg2/Crc32.cs b/skyscraper8/Mpeg2/Crc32.cs index 4e8bd75..b2fb901 100644 --- a/skyscraper8/Mpeg2/Crc32.cs +++ b/skyscraper8/Mpeg2/Crc32.cs @@ -112,6 +112,20 @@ namespace skyscraper5.Mpeg2 return crc == 0; } + public static bool ValidateCrc(ReadOnlySpan data) + { + uint crc = 0xffffffff; + + for (int i = 0; i < data.Length; i++) + { + uint b = (crc >> 24) & 0xff; + int c = (data[i]) & 0xff; + crc = (crc << 8) ^ table[b ^ c]; + } + + return crc == 0; + } + public static uint CreateCrc(MemoryStream ms, int offset, int end) { long restorePosition = ms.Position; diff --git a/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs index bad78b9..d8106af 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs @@ -13,7 +13,7 @@ using skyscraper8.Skyscraper.Drawing; namespace skyscraper8.Skyscraper.Scraper.Storage { - internal class NullObjectStorage : ObjectStorage + public class NullObjectStorage : ObjectStorage { public bool ObjectCarouselFileArrival(VfsFile vfsFile, int transportStreamId, int networkId) {