|
|
|
@ -21,67 +21,67 @@ internal ref struct Av1SymbolDecoder |
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive intra-block-copy distribution.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution tileIntraBlockCopy = Av1DefaultDistributions.IntraBlockCopy; |
|
|
|
private readonly Av1Distribution tileIntraBlockCopy; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive partition-type distributions.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution[] tilePartitionTypes = Av1DefaultDistributions.PartitionTypes; |
|
|
|
private readonly Av1Distribution[] tilePartitionTypes; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive key-frame luma-mode distributions.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution[][] keyFrameYMode = Av1DefaultDistributions.KeyFrameYMode; |
|
|
|
private readonly Av1Distribution[][] keyFrameYMode; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive chroma intra-mode distributions.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution[][] uvMode = Av1DefaultDistributions.UvMode; |
|
|
|
private readonly Av1Distribution[][] uvMode; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive transform-skip distributions.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution[] skip = Av1DefaultDistributions.Skip; |
|
|
|
private readonly Av1Distribution[] skip; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive skip-mode distributions.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution[] skipMode = Av1DefaultDistributions.SkipMode; |
|
|
|
private readonly Av1Distribution[] skipMode; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive absolute loop-filter delta distribution.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution deltaLoopFilterAbsolute = Av1DefaultDistributions.DeltaLoopFilterAbsolute; |
|
|
|
private readonly Av1Distribution deltaLoopFilterAbsolute; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive absolute quantizer delta distribution.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution deltaQuantizerAbsolute = Av1DefaultDistributions.DeltaQuantizerAbsolute; |
|
|
|
private readonly Av1Distribution deltaQuantizerAbsolute; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive spatial segment-identifier distributions.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution[] segmentId = Av1DefaultDistributions.SegmentId; |
|
|
|
private readonly Av1Distribution[] segmentId; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive directional angle-delta distributions.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution[] angleDelta = Av1DefaultDistributions.AngleDelta; |
|
|
|
private readonly Av1Distribution[] angleDelta; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive filter-intra mode distribution.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution filterIntraMode = Av1DefaultDistributions.FilterIntraMode; |
|
|
|
private readonly Av1Distribution filterIntraMode; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive filter-intra enable distributions.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution[] filterIntra = Av1DefaultDistributions.FilterIntra; |
|
|
|
private readonly Av1Distribution[] filterIntra; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive transform-size distributions.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution[][] transformSize = Av1DefaultDistributions.TransformSize; |
|
|
|
private readonly Av1Distribution[][] transformSize; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive end-of-block token distributions selected for the frame base quantizer.
|
|
|
|
@ -121,17 +121,17 @@ internal ref struct Av1SymbolDecoder |
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive joint chroma-from-luma sign distribution.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution chromaFromLumaSign = Av1DefaultDistributions.ChromaFromLumaSign; |
|
|
|
private readonly Av1Distribution chromaFromLumaSign; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive chroma-from-luma alpha-magnitude distributions.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution[] chromaFromLumaAlpha = Av1DefaultDistributions.ChromaFromLumaAlpha; |
|
|
|
private readonly Av1Distribution[] chromaFromLumaAlpha; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The tile-adaptive intra transform-type distributions.
|
|
|
|
/// </summary>
|
|
|
|
private readonly Av1Distribution[][][] intraExtendedTransform = Av1DefaultDistributions.IntraExtendedTransform; |
|
|
|
private readonly Av1Distribution[][][] intraExtendedTransform; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// The configuration providing temporary coefficient-context memory.
|
|
|
|
@ -154,18 +154,37 @@ internal ref struct Av1SymbolDecoder |
|
|
|
/// <param name="configuration">The configuration providing temporary memory.</param>
|
|
|
|
/// <param name="tileData">The entropy-coded tile payload.</param>
|
|
|
|
/// <param name="qIndex">The frame base quantizer index.</param>
|
|
|
|
public Av1SymbolDecoder(Configuration configuration, Span<byte> tileData, int qIndex) |
|
|
|
/// <param name="updateCdf">A value indicating whether decoded symbols adapt their tile distributions.</param>
|
|
|
|
public Av1SymbolDecoder(Configuration configuration, Span<byte> tileData, int qIndex, bool updateCdf = true) |
|
|
|
{ |
|
|
|
// Every tile starts from its own frame-context copy. Sharing these objects would let one image's adaptive
|
|
|
|
// updates change the initial probabilities used to decode the next tile or image.
|
|
|
|
this.tileIntraBlockCopy = Av1DefaultDistributions.IntraBlockCopy.CreateCopy(); |
|
|
|
this.tilePartitionTypes = Av1Distribution.CreateCopy(Av1DefaultDistributions.PartitionTypes); |
|
|
|
this.keyFrameYMode = Av1Distribution.CreateCopy(Av1DefaultDistributions.KeyFrameYMode); |
|
|
|
this.uvMode = Av1Distribution.CreateCopy(Av1DefaultDistributions.UvMode); |
|
|
|
this.skip = Av1Distribution.CreateCopy(Av1DefaultDistributions.Skip); |
|
|
|
this.skipMode = Av1Distribution.CreateCopy(Av1DefaultDistributions.SkipMode); |
|
|
|
this.deltaLoopFilterAbsolute = Av1DefaultDistributions.DeltaLoopFilterAbsolute.CreateCopy(); |
|
|
|
this.deltaQuantizerAbsolute = Av1DefaultDistributions.DeltaQuantizerAbsolute.CreateCopy(); |
|
|
|
this.segmentId = Av1Distribution.CreateCopy(Av1DefaultDistributions.SegmentId); |
|
|
|
this.angleDelta = Av1Distribution.CreateCopy(Av1DefaultDistributions.AngleDelta); |
|
|
|
this.filterIntraMode = Av1DefaultDistributions.FilterIntraMode.CreateCopy(); |
|
|
|
this.filterIntra = Av1Distribution.CreateCopy(Av1DefaultDistributions.FilterIntra); |
|
|
|
this.transformSize = Av1Distribution.CreateCopy(Av1DefaultDistributions.TransformSize); |
|
|
|
this.chromaFromLumaSign = Av1DefaultDistributions.ChromaFromLumaSign.CreateCopy(); |
|
|
|
this.chromaFromLumaAlpha = Av1Distribution.CreateCopy(Av1DefaultDistributions.ChromaFromLumaAlpha); |
|
|
|
this.intraExtendedTransform = Av1Distribution.CreateCopy(Av1DefaultDistributions.IntraExtendedTransform); |
|
|
|
this.configuration = configuration; |
|
|
|
this.reader = new Av1SymbolReader(tileData); |
|
|
|
this.reader = new Av1SymbolReader(tileData, updateCdf); |
|
|
|
this.baseQIndex = qIndex; |
|
|
|
this.endOfBlockFlag = Av1DefaultDistributions.GetEndOfBlockFlag(qIndex); |
|
|
|
this.coefficientsBase = Av1DefaultDistributions.GetCoefficientsBase(qIndex); |
|
|
|
this.baseEndOfBlock = Av1DefaultDistributions.GetBaseEndOfBlock(qIndex); |
|
|
|
this.dcSign = Av1DefaultDistributions.GetDcSign(qIndex); |
|
|
|
this.coefficientsBaseRange = Av1DefaultDistributions.GetCoefficientsBaseRange(qIndex); |
|
|
|
this.transformBlockSkip = Av1DefaultDistributions.GetTransformBlockSkip(qIndex); |
|
|
|
this.endOfBlockExtra = Av1DefaultDistributions.GetEndOfBlockExtra(qIndex); |
|
|
|
this.endOfBlockFlag = Av1Distribution.CreateCopy(Av1DefaultDistributions.GetEndOfBlockFlag(qIndex)); |
|
|
|
this.coefficientsBase = Av1Distribution.CreateCopy(Av1DefaultDistributions.GetCoefficientsBase(qIndex)); |
|
|
|
this.baseEndOfBlock = Av1Distribution.CreateCopy(Av1DefaultDistributions.GetBaseEndOfBlock(qIndex)); |
|
|
|
this.dcSign = Av1Distribution.CreateCopy(Av1DefaultDistributions.GetDcSign(qIndex)); |
|
|
|
this.coefficientsBaseRange = Av1Distribution.CreateCopy(Av1DefaultDistributions.GetCoefficientsBaseRange(qIndex)); |
|
|
|
this.transformBlockSkip = Av1Distribution.CreateCopy(Av1DefaultDistributions.GetTransformBlockSkip(qIndex)); |
|
|
|
this.endOfBlockExtra = Av1Distribution.CreateCopy(Av1DefaultDistributions.GetEndOfBlockExtra(qIndex)); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|