skyscraper8/skyscraper8/Atsc/A322/L1BasicSignalling.cs
feyris-tan ef903cba96
All checks were successful
🚀 Pack skyscraper8 / make-zip (push) Successful in 44s
Implemented ATSC 3 L1BasicSignalling and L1DetailSignalling
2026-05-25 22:48:07 +02:00

106 lines
3.7 KiB
C#

using skyscraper5.Skyscraper;
using skyscraper5.Skyscraper.IO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace skyscraper8.Atsc.A322
{
internal class L1BasicSignalling : Validatable
{
public L1BasicSignalling(byte[] buffer)
{
InBitStream bitstream = new InBitStream(buffer);
this.Version = new Version(bitstream.ReadBitsAsUInt16(3), 0);
MimoScatteredPilotEncoding = bitstream.ReadBitAsBoolean();
LlsFlag = bitstream.ReadBitAsBoolean();
TimeInfoFlag = (TimeInfoFlagSignalingFormat)bitstream.ReadBitsAsByte(2);
ReturnChannelFlag = bitstream.ReadBitAsBoolean();
PaprReduction = (PaprReductionSignalingFormat)bitstream.ReadBitsAsByte(2);
bool frameLengthMode = bitstream.ReadBitAsBoolean();
if (!frameLengthMode)
{
FrameLength = bitstream.ReadBitsAsUint(10);
ExcessSamplesPerSymbol = bitstream.ReadBitsAsUint(13);
}
else
{
TimeOffset = bitstream.ReadBitsAsUint(16);
AdditionalSamples = bitstream.ReadBitsAsByte(7);
}
NumSubframes = bitstream.ReadBitsAsByte(8);
PreambleNumSymbols = bitstream.ReadBitsAsByte(3);
PreambleReducedCarriers = bitstream.ReadBitsAsByte(3);
L1DetailContentTag = bitstream.ReadBitsAsByte(2);
L1DetailSizeBytes = bitstream.ReadBitsAsUint(13);
L1DetailFecType = bitstream.ReadBitsAsByte(3);
L1DetailAdditionalParityMode = bitstream.ReadBitsAsByte(2);
L1DetailTotalCells = bitstream.ReadBitsAsUint(19);
FirstSubMimo = bitstream.ReadBitAsBoolean();
FirstSubMiso = (MisoSignallingFormat)bitstream.ReadBitsAsByte(2);
FirstSubFftSize = (FftSizeSignallingFormat)bitstream.ReadBitsAsByte(2);
FirstSubReducedCarries = bitstream.ReadBitsAsByte(3);
FirstSubGuardInterval = bitstream.ReadBitsAsByte(4);
FirstSubNumOfdmSymbols = bitstream.ReadBitsAsUint(11);
FirstSubScatteredPilotPattern = bitstream.ReadBitsAsByte(5);
FirstSubScatteredPilotBoost = bitstream.ReadBitsAsByte(3);
FirstSubSbsFirst = bitstream.ReadBitAsBoolean();
FirstSubSbsLast = bitstream.ReadBitAsBoolean();
FirstSubMimoMixed = bitstream.ReadBitAsBoolean();
byte[] bytes = bitstream.ReadBitsAsByteArray(47); //reserved
uint crc = bitstream.ReadBitsAsUint(32);
Valid = true;
}
public Version Version { get; }
public bool MimoScatteredPilotEncoding { get; }
public bool LlsFlag { get; }
public TimeInfoFlagSignalingFormat TimeInfoFlag { get; }
public bool ReturnChannelFlag { get; }
public PaprReductionSignalingFormat PaprReduction { get; }
public uint? FrameLength { get; }
public uint? ExcessSamplesPerSymbol { get; }
public uint? TimeOffset { get; }
public byte AdditionalSamples { get; }
public byte NumSubframes { get; }
public byte PreambleNumSymbols { get; }
public byte PreambleReducedCarriers { get; }
public byte L1DetailContentTag { get; }
public uint L1DetailSizeBytes { get; }
public byte L1DetailFecType { get; }
public byte L1DetailAdditionalParityMode { get; }
public uint L1DetailTotalCells { get; }
public bool FirstSubMimo { get; }
public MisoSignallingFormat FirstSubMiso { get; }
public FftSizeSignallingFormat FirstSubFftSize { get; }
public byte FirstSubReducedCarries { get; }
public byte FirstSubGuardInterval { get; private set; }
public uint FirstSubNumOfdmSymbols { get; }
public byte FirstSubScatteredPilotPattern { get; }
public byte FirstSubScatteredPilotBoost { get; }
public bool FirstSubSbsFirst { get; }
public bool FirstSubSbsLast { get; }
public bool FirstSubMimoMixed { get; }
}
enum TimeInfoFlagSignalingFormat
{
NotIncluded,
IncludedMilliseconds,
IncludedMicroseconds,
IncludedNanoseconds,
}
enum PaprReductionSignalingFormat
{
NoPaprReduction,
ToneReservationOnly,
AceOnly,
TrAndAce
}
}