From 37a070b6653693e4348c9c283758b3ac4193e391 Mon Sep 17 00:00:00 2001 From: feyris-tan <4116042+feyris-tan@users.noreply.github.com> Date: Mon, 15 Jun 2026 22:53:52 +0200 Subject: [PATCH] Moved from MSTest to NUnit --- .gitignore | 3 + skyscraper8.Tests.NUnit/GlobalUsings.cs | 3 + .../Properties/Resources.Designer.cs | 48 ++-- .../Properties/Resources.resx | 82 +++--- .../Frame00000008_TSGS1_MIS000_SYNC001.bbf | Bin .../Frame00000012_TSGS1_MIS000_SYNC001.bbf | Bin ...Frame00000357_TSGS1_MIS000_SYNC184.bbframe | Bin .../Frame00001343_TSGS1_MIS000_SYNC001.bbf | Bin .../ModemCapabilitiesEncodingTest.bin | Bin ...shMacManagementMessage_Version4_Type45.bin | Bin ...5_V4_MultipartRegistrationResponseTest.bin | Bin ..._V4_MultipartRegistrationResponseTest2.bin | Bin .../TransmitChannelConfigurationObject.bin | Bin .../UpstreamChannelDescriptorTest.bin | Bin .../Resources/ranging_response_test.bin | Bin .../Resources/sdpTest.sdp | 0 .../Resources/test-1packet-01.ts | 0 .../Resources/test-2packets-02-03.ts | 0 .../Resources/test-3packets-04-05-06.ts | 0 .../SkyscrapersTestingFramework.cs | 79 ++++++ .../TestLog4NetAppender.cs | 30 +++ .../CoverageTests/DocsisCoverageTests.cs | 85 +++--- .../Tests/CoverageTests/Mpeg2CoverageTests.cs | 10 +- .../SkyscraperIntegrationTests.cs | 11 +- .../Tests/RecordedSamplesTests.cs | 250 +++++++++--------- .../ResourceTests/DocsisResourceTests.cs | 53 ++-- .../Tests/ResourceTests/GsResourceTests.cs | 11 +- .../ResourceTests/IetfSdpResourceTests.cs | 17 ++ .../Tests/ResourceTests/Mpeg2ResourceTests.cs | 19 +- .../ResourceTests/SkyscraperResourceTests.cs | 39 +++ .../skyscraper8.Tests.NUnit.csproj | 44 +++ .../skyscraper8.Tests.NUnit.csproj.user | 5 - skyscraper8.Tests/AllureConfig.json | 5 - skyscraper8.Tests/Feyllure.cs | 193 -------------- .../Properties/Resources.Designer.cs | 63 ----- skyscraper8.Tests/Properties/Resources.resx | 101 ------- skyscraper8.Tests/ResourceTests/SdpTest.cs | 25 -- .../ResourceTests/SkyscraperTests.cs | 42 --- skyscraper8.Tests/skyscraper8.Tests.csproj | 47 ---- skyscraper8.sln | 10 +- skyscraper8.sln.DotSettings.user | 1 + skyscraper8/Atsc/A331/Atsc3EventHandler.cs | 1 + skyscraper8/Atsc/A331/Atsc3Receiver.cs | 4 + skyscraper8/MpegDash/MbmsEnvelope.cs | 24 ++ .../AtmAdaptationLayer5NetworkIdentifier.cs | 12 + .../Scraper/ISkyscraperUiJunction.cs | 4 + .../Skyscraper/Scraper/SkyscraperContext.cs | 36 ++- .../Scraper/SkyscraperContextEvent.cs | 3 +- .../Skyscraper/Scraper/SkyscraperUiFeature.cs | 3 +- .../Skyscraper/Scraper/Storage/DataStorage.cs | 7 + .../Storage/Filesystem/FilesystemStorage.cs | 5 + .../InMemory/InMemoryScraperStorage.cs | 17 ++ 52 files changed, 611 insertions(+), 781 deletions(-) create mode 100644 skyscraper8.Tests.NUnit/GlobalUsings.cs rename skyscraper8.Tests/Resources1.Designer.cs => skyscraper8.Tests.NUnit/Properties/Resources.Designer.cs (93%) rename skyscraper8.Tests/Resources1.resx => skyscraper8.Tests.NUnit/Properties/Resources.resx (74%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/Frame00000008_TSGS1_MIS000_SYNC001.bbf (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/Frame00000012_TSGS1_MIS000_SYNC001.bbf (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/Frame00000357_TSGS1_MIS000_SYNC184.bbframe (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/Frame00001343_TSGS1_MIS000_SYNC001.bbf (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/ModemCapabilitiesEncodingTest.bin (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/PushMacManagementMessage_Version4_Type45.bin (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/T45_V4_MultipartRegistrationResponseTest.bin (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/T45_V4_MultipartRegistrationResponseTest2.bin (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/TransmitChannelConfigurationObject.bin (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/UpstreamChannelDescriptorTest.bin (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/ranging_response_test.bin (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/sdpTest.sdp (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/test-1packet-01.ts (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/test-2packets-02-03.ts (100%) rename {skyscraper8.Tests => skyscraper8.Tests.NUnit}/Resources/test-3packets-04-05-06.ts (100%) create mode 100644 skyscraper8.Tests.NUnit/SkyscrapersTestingFramework.cs create mode 100644 skyscraper8.Tests.NUnit/TestLog4NetAppender.cs rename skyscraper8.Tests/RootTests/DocsisTests.cs => skyscraper8.Tests.NUnit/Tests/CoverageTests/DocsisCoverageTests.cs (97%) rename skyscraper8.Tests/RootTests/Mpeg2Tests.cs => skyscraper8.Tests.NUnit/Tests/CoverageTests/Mpeg2CoverageTests.cs (51%) rename skyscraper8.Tests/IntegrationTests.cs => skyscraper8.Tests.NUnit/Tests/IntegrationTests/SkyscraperIntegrationTests.cs (82%) rename skyscraper8.Tests/CapturedTests.cs => skyscraper8.Tests.NUnit/Tests/RecordedSamplesTests.cs (84%) rename skyscraper8.Tests/ResourceTests/DocsisTests.cs => skyscraper8.Tests.NUnit/Tests/ResourceTests/DocsisResourceTests.cs (74%) rename skyscraper8.Tests/ResourceTests/Ses12GseTest.cs => skyscraper8.Tests.NUnit/Tests/ResourceTests/GsResourceTests.cs (59%) create mode 100644 skyscraper8.Tests.NUnit/Tests/ResourceTests/IetfSdpResourceTests.cs rename skyscraper8.Tests/ResourceTests/GsType1SanityTest.cs => skyscraper8.Tests.NUnit/Tests/ResourceTests/Mpeg2ResourceTests.cs (57%) create mode 100644 skyscraper8.Tests.NUnit/Tests/ResourceTests/SkyscraperResourceTests.cs create mode 100644 skyscraper8.Tests.NUnit/skyscraper8.Tests.NUnit.csproj rename skyscraper8.Tests/skyscraper8.Tests.csproj.user => skyscraper8.Tests.NUnit/skyscraper8.Tests.NUnit.csproj.user (55%) delete mode 100644 skyscraper8.Tests/AllureConfig.json delete mode 100644 skyscraper8.Tests/Feyllure.cs delete mode 100644 skyscraper8.Tests/Properties/Resources.Designer.cs delete mode 100644 skyscraper8.Tests/Properties/Resources.resx delete mode 100644 skyscraper8.Tests/ResourceTests/SdpTest.cs delete mode 100644 skyscraper8.Tests/ResourceTests/SkyscraperTests.cs delete mode 100644 skyscraper8.Tests/skyscraper8.Tests.csproj diff --git a/.gitignore b/.gitignore index 9c16ee6..e46f1ca 100644 --- a/.gitignore +++ b/.gitignore @@ -135,3 +135,6 @@ imgui.ini /.vs/skyscraper8/CopilotIndices/17.14.1431.25910 /.vs /skyscraper8/bin/Debug/satip +/skyscraper8.Tests.NUnit/bin/Debug/net8.0 +/skyscraper8.Tests.NUnit/obj/Debug/net8.0 +/skyscraper8.Tests.NUnit/obj diff --git a/skyscraper8.Tests.NUnit/GlobalUsings.cs b/skyscraper8.Tests.NUnit/GlobalUsings.cs new file mode 100644 index 0000000..4f7b4e7 --- /dev/null +++ b/skyscraper8.Tests.NUnit/GlobalUsings.cs @@ -0,0 +1,3 @@ +global using NUnit.Framework; + +[assembly: LevelOfParallelism(1)] diff --git a/skyscraper8.Tests/Resources1.Designer.cs b/skyscraper8.Tests.NUnit/Properties/Resources.Designer.cs similarity index 93% rename from skyscraper8.Tests/Resources1.Designer.cs rename to skyscraper8.Tests.NUnit/Properties/Resources.Designer.cs index e60c27e..ee3869e 100644 --- a/skyscraper8.Tests/Resources1.Designer.cs +++ b/skyscraper8.Tests.NUnit/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace skyscraper8.Tests { +namespace skyscraper8.Tests.NUnit.Properties { using System; @@ -22,14 +22,14 @@ namespace skyscraper8.Tests { [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources1 { + internal class Resources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources1() { + internal Resources() { } /// @@ -39,7 +39,7 @@ namespace skyscraper8.Tests { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("skyscraper8.Tests.Resources1", typeof(Resources1).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("skyscraper8.Tests.NUnit.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; @@ -110,26 +110,6 @@ namespace skyscraper8.Tests { } } - /// - /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. - /// - internal static byte[] MultipartRegistrationResponseTest { - get { - object obj = ResourceManager.GetObject("MultipartRegistrationResponseTest", resourceCulture); - return ((byte[])(obj)); - } - } - - /// - /// 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[]. /// @@ -160,6 +140,26 @@ namespace skyscraper8.Tests { } } + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. + /// + internal static byte[] T45_V4_MultipartRegistrationResponseTest { + get { + object obj = ResourceManager.GetObject("T45_V4_MultipartRegistrationResponseTest", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. + /// + internal static byte[] T45_V4_MultipartRegistrationResponseTest2 { + get { + object obj = ResourceManager.GetObject("T45_V4_MultipartRegistrationResponseTest2", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Sucht eine lokalisierte Ressource vom Typ System.Byte[]. /// diff --git a/skyscraper8.Tests/Resources1.resx b/skyscraper8.Tests.NUnit/Properties/Resources.resx similarity index 74% rename from skyscraper8.Tests/Resources1.resx rename to skyscraper8.Tests.NUnit/Properties/Resources.resx index 7aca4aa..3798142 100644 --- a/skyscraper8.Tests/Resources1.resx +++ b/skyscraper8.Tests.NUnit/Properties/Resources.resx @@ -1,4 +1,4 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/skyscraper8.Tests/ResourceTests/SdpTest.cs b/skyscraper8.Tests/ResourceTests/SdpTest.cs deleted file mode 100644 index 7aa47be..0000000 --- a/skyscraper8.Tests/ResourceTests/SdpTest.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using skyscraper8.Ietf.Rfc4566_SDP; - -namespace skyscraper8.Tests.ResourceTests -{ - [TestClass] - public class SdpTest : Feyllure - { - [TestMethod] - public void TestSdpParser() - { - MemoryStream ms = new MemoryStream(Resources1.sdpTest, false); - Assert.IsTrue(SDP.IsSDP(ms)); - - SDP loaded = SDP.Load(ms); - Assert.IsNotNull(loaded); - } - } -} diff --git a/skyscraper8.Tests/ResourceTests/SkyscraperTests.cs b/skyscraper8.Tests/ResourceTests/SkyscraperTests.cs deleted file mode 100644 index 5ae68a4..0000000 --- a/skyscraper8.Tests/ResourceTests/SkyscraperTests.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.IO; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using skyscraper5.Mpeg2; -using skyscraper5.Skyscraper.Scraper; -using skyscraper5.Skyscraper.Scraper.Storage.InMemory; -using skyscraper8.Skyscraper.Scraper.Storage; - -namespace skyscraper8.Tests.ResourceTests -{ - [TestClass] - public class SkyscraperTests : Feyllure - { - [TestMethod] - public void RunTestPatterns() - { - byte[][] buffers = new byte[][] - { - Resources1.test_1packet_01, - Resources1.test_2packets_02_03, - Resources1.test_3packets_04_05_06 - }; - - InMemoryScraperStorageFactory imssf = new InMemoryScraperStorageFactory(); - - foreach (byte[] buffer in buffers) - { - TsContext mpeg2 = new TsContext(); - DataStorage ds = new InMemoryScraperStorageFactory().CreateDataStorage(); - ObjectStorage os = new NullObjectStorage(); - - SkyscraperContext skyscraper = new SkyscraperContext(mpeg2, ds, os); - MemoryStream ms = new MemoryStream(buffer, false); - - skyscraper.InitalizeFilterChain(); - skyscraper.IngestFromStream(ms); - - ms.Close(); - ms.Dispose(); - } - } - } -} diff --git a/skyscraper8.Tests/skyscraper8.Tests.csproj b/skyscraper8.Tests/skyscraper8.Tests.csproj deleted file mode 100644 index b45b07c..0000000 --- a/skyscraper8.Tests/skyscraper8.Tests.csproj +++ /dev/null @@ -1,47 +0,0 @@ - - - - - net8.0 - - - true - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - True - True - Resources1.resx - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - - - ResXFileCodeGenerator - Resources1.Designer.cs - - - - \ No newline at end of file diff --git a/skyscraper8.sln b/skyscraper8.sln index 6910010..660d655 100644 --- a/skyscraper8.sln +++ b/skyscraper8.sln @@ -65,7 +65,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.UI.MonoGame", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.UI.MonoGame.Bridge", "GUIs\skyscraper8.UI.ImGui.MonoGame.Bridge\skyscraper8.UI.MonoGame.Bridge.csproj", "{1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.Tests", "skyscraper8.Tests\skyscraper8.Tests.csproj", "{84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "skyscraper8.Tests.NUnit", "skyscraper8.Tests.NUnit\skyscraper8.Tests.NUnit.csproj", "{5FB2AA76-580E-4343-B155-5D596DDC27F2}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -143,10 +143,10 @@ Global {1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Release|Any CPU.ActiveCfg = Release|Any CPU {1A29F6E6-4B6A-DCCD-1DF1-AA8D020E17D2}.Release|Any CPU.Build.0 = Release|Any CPU - {84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Debug|Any CPU.Build.0 = Debug|Any CPU - {84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Release|Any CPU.ActiveCfg = Release|Any CPU - {84EE9FCD-2C7F-DF84-C1BA-99D018CE9412}.Release|Any CPU.Build.0 = Release|Any CPU + {5FB2AA76-580E-4343-B155-5D596DDC27F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5FB2AA76-580E-4343-B155-5D596DDC27F2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5FB2AA76-580E-4343-B155-5D596DDC27F2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5FB2AA76-580E-4343-B155-5D596DDC27F2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/skyscraper8.sln.DotSettings.user b/skyscraper8.sln.DotSettings.user index d30f659..53ea3b3 100644 --- a/skyscraper8.sln.DotSettings.user +++ b/skyscraper8.sln.DotSettings.user @@ -8,6 +8,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded diff --git a/skyscraper8/Atsc/A331/Atsc3EventHandler.cs b/skyscraper8/Atsc/A331/Atsc3EventHandler.cs index 9de66ec..5fcb6aa 100644 --- a/skyscraper8/Atsc/A331/Atsc3EventHandler.cs +++ b/skyscraper8/Atsc/A331/Atsc3EventHandler.cs @@ -14,5 +14,6 @@ namespace skyscraper8.Atsc.A331 void OnAtsc3Detected(); void OnAtsc3ServiceList(sltType slt); void OnAtsc3FileDelivery(IPEndPoint destination, ulong tsi, ulong toi, FluteListener targetListener, GuessedFluteDataType guessedFluteDataType, string outFileName); + void OnAtsc3MbmsEnvelope(MbmsEnvelope mbmsEnvelope); } } diff --git a/skyscraper8/Atsc/A331/Atsc3Receiver.cs b/skyscraper8/Atsc/A331/Atsc3Receiver.cs index 96d0a74..2ff6014 100644 --- a/skyscraper8/Atsc/A331/Atsc3Receiver.cs +++ b/skyscraper8/Atsc/A331/Atsc3Receiver.cs @@ -169,6 +169,10 @@ namespace skyscraper8.Atsc.A331 case GuessedFluteDataType.Mime: MimeMessage mimeMessage = MimeMessage.Load(targetListener.ToStream()); MbmsEnvelope mbmsEnvelope = new MbmsEnvelope(mimeMessage); + if (mbmsEnvelope.HasContent) + { + eventHandler.OnAtsc3MbmsEnvelope(mbmsEnvelope); + } filenames.LearnFilename(mbmsEnvelope); return true; case GuessedFluteDataType.Stuffing: diff --git a/skyscraper8/MpegDash/MbmsEnvelope.cs b/skyscraper8/MpegDash/MbmsEnvelope.cs index e1cc3d8..52fc4d7 100644 --- a/skyscraper8/MpegDash/MbmsEnvelope.cs +++ b/skyscraper8/MpegDash/MbmsEnvelope.cs @@ -1,5 +1,6 @@ using MimeKit; using Schemas; +using skyscraper5.Skyscraper; using skyscraper8.Atsc.A331.Schema; using skyscraper8.MpegDash.Schema; @@ -48,4 +49,27 @@ public class MbmsEnvelope public MPDtype MediaPresentationDescription { get; private set; } public metadataEnvelopeType MetadataEnvelope {get; private set;} + + public bool HasContent + { + get + { + if (Atsc3RouteUsd != null) + return true; + + if (Atsc3Stsid != null) + return true; + + if (Atsc3Held != null) + return true; + + if (MediaPresentationDescription != null) + return true; + + if (MetadataEnvelope != null) + return true; + + return false; + } + } } diff --git a/skyscraper8/Skyscraper/Net/VirtualNetworks/AtmAdaptationLayer5NetworkIdentifier.cs b/skyscraper8/Skyscraper/Net/VirtualNetworks/AtmAdaptationLayer5NetworkIdentifier.cs index 57dc021..aadac37 100644 --- a/skyscraper8/Skyscraper/Net/VirtualNetworks/AtmAdaptationLayer5NetworkIdentifier.cs +++ b/skyscraper8/Skyscraper/Net/VirtualNetworks/AtmAdaptationLayer5NetworkIdentifier.cs @@ -53,5 +53,17 @@ namespace skyscraper8.Skyscraper.Net.VirtualNetworks return child; } } + + public ushort? GetPid() + { + VirtualNetworkIdentifier virtualNetworkIdentifier = wrapped; + PidNetworkIdentifier pid = wrapped as PidNetworkIdentifier; + if (pid != null) + { + return pid.PID; + } + + return null; + } } } diff --git a/skyscraper8/Skyscraper/Scraper/ISkyscraperUiJunction.cs b/skyscraper8/Skyscraper/Scraper/ISkyscraperUiJunction.cs index d604b5d..612145f 100644 --- a/skyscraper8/Skyscraper/Scraper/ISkyscraperUiJunction.cs +++ b/skyscraper8/Skyscraper/Scraper/ISkyscraperUiJunction.cs @@ -21,6 +21,8 @@ using skyscraper5.src.InteractionChannel.Model2; using skyscraper5.src.Skyscraper.FrequencyListGenerator; using skyscraper5.T2MI.Packets; using skyscraper5.Teletext.Wss; +using skyscraper8.Atsc.A331; +using skyscraper8.Atsc.A331.Schema; using skyscraper8.DvbNip; using skyscraper8.DvbNip.UiIntegration; using skyscraper8.DvbSis; @@ -251,5 +253,7 @@ namespace skyscraper5.Skyscraper.Scraper void WneStoryError(uint sessionId); void WneStoryProgress(uint sessionId, string filename, long fileCaught, uint fileSize); void WneStoryComplete(uint sessionId, string filename); + void Atsc3Service(sltType slt); + void Atsc3MbmsEnvelope(MbmsEnvelope mbmsEnvelope); } } diff --git a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs index 120981e..e6e0512 100644 --- a/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs +++ b/skyscraper8/Skyscraper/Scraper/SkyscraperContext.cs @@ -106,7 +106,8 @@ namespace skyscraper5.Skyscraper.Scraper UpdateNotificationEventHandler, DataCarouselEventHandler, RdsEventHandler, IScte35EventHandler, IAutodetectionEventHandler, IRstEventHandler, IRntEventHandler, IMultiprotocolEncapsulationEventHandler, ObjectCarouselEventHandler, T2MIEventHandler, IDisposable, IFrameGrabberEventHandler, IntEventHandler, IRctEventHandler, ISkyscraperContext, IDocsisEventHandler, AbertisDecoderEventHandler, Id3Handler, - InteractionChannelHandler, SgtEventHandler, IDvbNipEventHandler, UleEventHandler, OtvSsuHandler, NdsSsuHandler, ISubTsHandler, ILldpFrameHandler, SisHandler, IWneHandler, IAtscPlpEventHandler, IAtsc3EventHandler + InteractionChannelHandler, SgtEventHandler, IDvbNipEventHandler, UleEventHandler, OtvSsuHandler, NdsSsuHandler, ISubTsHandler, ILldpFrameHandler, SisHandler, IWneHandler, + IAtscPlpEventHandler, IAtsc3EventHandler { public const bool ALLOW_STREAM_TYPE_AUTODETECTION = true; public const bool ALLOW_FFMPEG_FRAMEGRABBER = true; @@ -3034,6 +3035,15 @@ namespace skyscraper5.Skyscraper.Scraper { TeiOnOffFilter.SetExempt(pidId.PID); } + AtmAdaptationLayer5NetworkIdentifier aal5Id = network as AtmAdaptationLayer5NetworkIdentifier; + if (aal5Id != null) + { + ushort? pid = aal5Id.GetPid(); + if (pid != null) + { + TeiOnOffFilter.SetExempt(pid.Value); + } + } if (etherType <= 1500) @@ -3095,7 +3105,7 @@ namespace skyscraper5.Skyscraper.Scraper ushort newEtherType = BitConverter.ToUInt16(contents, 26); byte[] newPacket = new byte[contents.Length - 28]; Array.Copy(contents, 28, newPacket, 0, newPacket.Length); - OnEthernetFrame(AtmAdaptationLayer5NetworkIdentifier.GetWrap(network), destination, source, newEtherType, newPacket); + OnEthernetFrame(network, destination, source, newEtherType, newPacket); } return; case 0x94ad: @@ -3580,12 +3590,14 @@ namespace skyscraper5.Skyscraper.Scraper public void OnAtsc3Detected() { LogEvent(SkyscraperContextEvent.Atsc3Detected); + UiJunction?.EnableUiFeature(SkyscraperUiFeature.Atsc3Analysis); } public void OnAtsc3ServiceList(sltType slt) { foreach (serviceType service in slt.Service) { + UiJunction?.Atsc3Service(slt); if (DataStorage.UpsertAtsc3Service(service)) { LogEvent(SkyscraperContextEvent.Atsc3ServiceFound, service.shortServiceName); @@ -3604,5 +3616,25 @@ namespace skyscraper5.Skyscraper.Scraper stream.Dispose(); } } + + public void OnAtsc3MbmsEnvelope(MbmsEnvelope mbmsEnvelope) + { + UiJunction?.Atsc3MbmsEnvelope(mbmsEnvelope); + if (mbmsEnvelope.Atsc3Held != null) + { + foreach (HTMLEntryPackageType htmlEntryPackageType in mbmsEnvelope.Atsc3Held.HTMLEntryPackage) + { + if (DataStorage.UpsertAtsc3Held(htmlEntryPackageType)) + { + LogEvent(SkyscraperContextEvent.Atsc3Held, htmlEntryPackageType.appContextId); + } + } + } + + //ROUTE USD has no clear identifier. + //STSID has no clear identifier. + //MPD has no clear identifier. + //Metadata Envelope has no clear identifier + } } } diff --git a/skyscraper8/Skyscraper/Scraper/SkyscraperContextEvent.cs b/skyscraper8/Skyscraper/Scraper/SkyscraperContextEvent.cs index 123d6e0..a44f5a5 100644 --- a/skyscraper8/Skyscraper/Scraper/SkyscraperContextEvent.cs +++ b/skyscraper8/Skyscraper/Scraper/SkyscraperContextEvent.cs @@ -107,6 +107,7 @@ DvbSisDaughterSiteAdapterConfiguration, Atsc3Detected, Atsc3ServiceFound, - Atsc3Segment + Atsc3Segment, + Atsc3Held } } diff --git a/skyscraper8/Skyscraper/Scraper/SkyscraperUiFeature.cs b/skyscraper8/Skyscraper/Scraper/SkyscraperUiFeature.cs index 5a23784..3b29960 100644 --- a/skyscraper8/Skyscraper/Scraper/SkyscraperUiFeature.cs +++ b/skyscraper8/Skyscraper/Scraper/SkyscraperUiFeature.cs @@ -15,6 +15,7 @@ namespace skyscraper8.Skyscraper.Scraper GseAnalysis, DvbNipAnalyis, RcsAnalysis, - LlcSnapTrafficAnalysis + LlcSnapTrafficAnalysis, + Atsc3Analysis } } diff --git a/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs index 0979eeb..31dada9 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/DataStorage.cs @@ -204,5 +204,12 @@ namespace skyscraper8.Skyscraper.Scraper.Storage /// An ATSC3 Service /// true if the service was added or was changed, false if no changes in the DB were made. bool UpsertAtsc3Service(serviceType service); + + /// + /// Inserts or Updates the HELD table row of an ATSC 3 service. + /// + /// A row of a HELD table + /// true if the service was added or was changed + bool UpsertAtsc3Held(HTMLEntryPackageType htmlEntryPackageType); } } diff --git a/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs index 50ec7ab..321b06f 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/Filesystem/FilesystemStorage.cs @@ -1788,6 +1788,11 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.Filesystem throw new NotImplementedException(); } + public bool UpsertAtsc3Held(HTMLEntryPackageType htmlEntryPackageType) + { + throw new NotImplementedException(); + } + public RfSpectrumData GetRfSpectrum(Guid jobGuid) { string filename = Path.Combine(rootDirectory.FullName, "rf", jobGuid.ToString() + ".rf"); diff --git a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs index 83b5795..74db3dc 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/InMemory/InMemoryScraperStorage.cs @@ -1905,5 +1905,22 @@ namespace skyscraper5.Skyscraper.Scraper.Storage.InMemory return true; } } + + private Dictionary _atsc3Helds; + public bool UpsertAtsc3Held(HTMLEntryPackageType htmlEntryPackageType) + { + if (_atsc3Helds == null) + _atsc3Helds = new Dictionary(); + + if (_atsc3Helds.ContainsKey(htmlEntryPackageType.appContextId)) + { + return false; + } + else + { + _atsc3Helds.Add(htmlEntryPackageType.appContextId, htmlEntryPackageType); + return true; + } + } } }