From 1843d914ed51a4d9819e3d6247fce5696a7ba35b Mon Sep 17 00:00:00 2001 From: feyris-tan <4116042+feyris-tan@users.noreply.github.com> Date: Thu, 28 May 2026 22:28:19 +0200 Subject: [PATCH] Refactor ATSC PLP Parser to use Span instead of byte[] --- .../Atsc/A322/AtscPlpBasebandParser.cs | 49 ++++++++++++++----- .../A324/BasebandPacketDataStreamReceiver.cs | 5 +- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/skyscraper8/Atsc/A322/AtscPlpBasebandParser.cs b/skyscraper8/Atsc/A322/AtscPlpBasebandParser.cs index 5141b51..263a4a2 100644 --- a/skyscraper8/Atsc/A322/AtscPlpBasebandParser.cs +++ b/skyscraper8/Atsc/A322/AtscPlpBasebandParser.cs @@ -13,10 +13,9 @@ namespace skyscraper8.Atsc.A322 { internal class AtscPlpBasebandParser { - internal void PushBbframe(byte[] payload) + internal void PushBbframe(Span payload) { - MemoryStream ms = new MemoryStream(payload); - byte a = ms.ReadUInt8(); + byte a = payload[0]; bool mode = ((a >> 7) & 0x01) != 0; int pointer = (a & 0x7f); int addToPointer; @@ -29,7 +28,7 @@ namespace skyscraper8.Atsc.A322 else { addToPointer = 2; - byte b = ms.ReadUInt8(); + byte b = payload[1]; pointer |= (((b >> 2) & 0x3F) << 7); OfiDescription ofi = (OfiDescription)(b & 0x3); switch (ofi) @@ -37,29 +36,45 @@ namespace skyscraper8.Atsc.A322 case OfiDescription.NoExtensionMode: break; case OfiDescription.LongExtensionMode: - byte lc = ms.ReadUInt8(); + byte lc = payload[2]; addToPointer++; int extType = (lc >> 5) & 0x7; int extLen = (lc) & 0x1F; - byte ld = ms.ReadUInt8(); + byte ld = payload[3]; addToPointer++; extLen |= (((ld) & 0xFF) << 5); // see A322-2026-04-Physical-Layer-Protocol.pdf, Table 5.2 //0 = counter //7 = padding - byte[] extensionFiled = ms.ReadBytes(extLen); + Span extensionField = payload.Slice(4, extLen); addToPointer += extLen; - if (extType != 7) - { - throw new NotImplementedException(String.Format("ATSC 3.0 BBFRAME Padding Type {0} not yet implemented.", extType)); - } + HandleExtension(true, extType, extensionField); + break; + case OfiDescription.ShortExtensionMode: + byte lc2 = payload[2]; + addToPointer++; + int extType2 = (lc2 >> 5) & 0x07; + int extLen2 = (lc2) & 0x1f; + + Span extensionField2 = payload.Slice(4, extLen2); + addToPointer += extLen2; + HandleExtension(false, extType2, extensionField2); break; default: throw new NotImplementedException(String.Format("{0} is not yet implemented in the ATSC 3.0 BBFrame Parser.", ofi)); } } - while (ms.GetAvailableBytes() > 0) + Span bbHeaderStripped = payload.Slice(addToPointer); + if (pointer + 4 > bbHeaderStripped.Length) + { + Console.WriteLine("BBFRame, offset: {0}, less than four bytes left.", pointer); + } + else + { + Console.WriteLine("BBFRame, offset: {0}, first bytes: 0x{1:X2}{2:X2}{3:X2}{4:X2}", pointer, bbHeaderStripped[pointer], bbHeaderStripped[pointer + 1], bbHeaderStripped[pointer + 2], bbHeaderStripped[pointer + 3]); + } + /*while (ms.GetAvailableBytes() > 0) { switch(stateMachineState) { @@ -169,7 +184,17 @@ namespace skyscraper8.Atsc.A322 default: throw new NotImplementedException(String.Format("ATSC PLP Baseband Parser State machine state #{0}", stateMachineState)); } + }*/ + } + + private void HandleExtension(bool isLongExtension, int extType, Span extensionField) + { + if (extType == 7) + { + //Padding + return; } + throw new NotImplementedException(); } private void DeliverPacket(AlpPacket? currentAlpPacket, byte[]? neededBuffer) diff --git a/skyscraper8/Atsc/A324/BasebandPacketDataStreamReceiver.cs b/skyscraper8/Atsc/A324/BasebandPacketDataStreamReceiver.cs index 812c6b9..53cdb25 100644 --- a/skyscraper8/Atsc/A324/BasebandPacketDataStreamReceiver.cs +++ b/skyscraper8/Atsc/A324/BasebandPacketDataStreamReceiver.cs @@ -94,7 +94,8 @@ namespace skyscraper8.Atsc.A324 } else if (plp <= 63) { - HandlePlp(plp, rtpPacket.RtpPayload); + Span rtpPayloadSpan = new Span(rtpPacket.RtpPayload); + HandlePlp(plp, rtpPayloadSpan); return; } } @@ -149,7 +150,7 @@ namespace skyscraper8.Atsc.A324 } private AtscPlpBasebandParser[] plps; - private void HandlePlp(ushort plp, byte[] rtpPayload) + private void HandlePlp(ushort plp, Span rtpPayload) { if (plps == null) {