106 lines
3.7 KiB
C#
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
|
|
}
|
|
|
|
}
|