public SubbandPrecinct(ResolutionLevel resolutionLevel, Subband subband, Precinct precinct) { ResolutionLevel = resolutionLevel; Subband = subband; Precinct = precinct; SubbandTileComponentSampleBounds_tb = ResolutionLevel.TilePartComponent.TileComponent.GetSubbandTileComponentSampleBounds_tb(subband); NCodeBlocksX = CeilDiv(SubbandTileComponentSampleBounds_tb.Width, ResolutionLevel.CodeBlockWidth); NCodeBlocksY = CeilDiv(SubbandTileComponentSampleBounds_tb.Height, ResolutionLevel.CodeBlockHeight); CodeBlockInclusionTagTree = new TagTree((uint)NCodeBlocksX, (uint)NCodeBlocksY); ZeroBitPlaneTagTree = new TagTree((uint)NCodeBlocksX, (uint)NCodeBlocksY); CodeBlocks = new CodeBlock[NCodeBlocksY * NCodeBlocksX]; var uRange = SubbandTileComponentSampleBounds_tb.XRange; var vRange = SubbandTileComponentSampleBounds_tb.YRange; TransformCoefficientValues = ResolutionLevel.TilePartComponent.ArithmeticType switch { ArithmeticType.Int32 => new Signal2D <int>(uRange, vRange), ArithmeticType.Single => new Signal2D <float>(uRange, vRange), ArithmeticType.Double => new Signal2D <double>(uRange, vRange), _ => throw NotSupported(ResolutionLevel.TilePartComponent.ArithmeticType) }; }
protected sealed override void Dequantisize(Signal2D <T> transformCoefficientValues, TilePartComponent component, Subband subband) { var quantizationStepSize = GetQuantizationStepSize(component, subband); if (quantizationStepSize != 1) { transformCoefficientValues.URange.GetBounds(out int u0, out int u1); transformCoefficientValues.VRange.GetBounds(out int v0, out int v1); Parallel.For(v0, v1, v => { for (var u = u0; u < u1; u++) { ApplyQuantizationStepSize(transformCoefficientValues, u, v, quantizationStepSize); } }); } }
private static void CopyToPixelDataBuffer(TilePartComponent tilePartComponent, Signal2D a, int[] buffer, int offset, int count) { var inverseDCLevelShifter = InverseDCLevelShifter.Create(tilePartComponent.ArithmeticType); inverseDCLevelShifter.CopyToPixelDataBuffer(tilePartComponent.TileComponent.Component, a, buffer, offset, count); }
protected abstract void ApplyQuantizationStepSize(Signal2D <T> transformCoefficientValues, int u, int v, double quantizationStepSize);
protected sealed override void Dequantisize(Signal2D <T> transformCoefficientValues, TilePartComponent tilePartComponent, Subband subband) { // Nothing to do }
public abstract void Dequantisize(Signal2D transformCoefficientValues, TilePartComponent tilePartComponent, Subband subband);
protected sealed override void ApplyQuantizationStepSize(Signal2D <double> transformCoefficientValues, int u, int v, double quantizationStepSize) { transformCoefficientValues[u, v] *= quantizationStepSize; }
public abstract void Perform2DSubbandReconstruction(Signal2D a, Signal2D aLL, Signal2D aHL, Signal2D aLH, Signal2D aHH);
public abstract void CopyToPixelDataBuffer(Component component, Signal2D a, int[] buffer, int offset, int count);