From 202d7b8c6f43ac206dd959c8ba279d242d25a6f0 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sun, 30 Aug 2026 00:03:56 +1000 Subject: [PATCH] Correct AV1 inverse transform operator ownership --- HEIF_IMPLEMENTATION_PLAN.md | 3 +- ...> Av1InverseTransformer.Adst16Operator.cs} | 2 +- ...=> Av1InverseTransformer.Adst4Operator.cs} | 2 +- ...=> Av1InverseTransformer.Adst8Operator.cs} | 2 +- ...=> Av1InverseTransformer.Dct16Operator.cs} | 2 +- ...=> Av1InverseTransformer.Dct32Operator.cs} | 2 +- ... => Av1InverseTransformer.Dct4Operator.cs} | 2 +- ...=> Av1InverseTransformer.Dct64Operator.cs} | 2 +- ... => Av1InverseTransformer.Dct8Operator.cs} | 2 +- ...1InverseTransformer.Identity16Operator.cs} | 2 +- ...1InverseTransformer.Identity32Operator.cs} | 2 +- ...v1InverseTransformer.Identity4Operator.cs} | 2 +- ...v1InverseTransformer.Identity8Operator.cs} | 2 +- ...r.cs => Av1InverseTransformer.Operator.cs} | 2 +- ...> Av1InverseTransformer.OutputOperator.cs} | 2 +- .../Av1/Transform/Av1InverseTransformer.cs | 2 +- .../Transform/Av1InverseTransformerFactory.cs | 4 +- .../Av1InverseWalshHadamardTransformer.cs | 12 +- .../Heif/Av1/Av1InverseTransformTests.cs | 136 +++++++++--------- 19 files changed, 93 insertions(+), 92 deletions(-) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Adst16Operator.cs => Av1InverseTransformer.Adst16Operator.cs} (99%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Adst4Operator.cs => Av1InverseTransformer.Adst4Operator.cs} (99%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Adst8Operator.cs => Av1InverseTransformer.Adst8Operator.cs} (99%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Dct16Operator.cs => Av1InverseTransformer.Dct16Operator.cs} (99%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Dct32Operator.cs => Av1InverseTransformer.Dct32Operator.cs} (99%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Dct4Operator.cs => Av1InverseTransformer.Dct4Operator.cs} (99%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Dct64Operator.cs => Av1InverseTransformer.Dct64Operator.cs} (99%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Dct8Operator.cs => Av1InverseTransformer.Dct8Operator.cs} (99%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Identity16Operator.cs => Av1InverseTransformer.Identity16Operator.cs} (98%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Identity32Operator.cs => Av1InverseTransformer.Identity32Operator.cs} (98%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Identity4Operator.cs => Av1InverseTransformer.Identity4Operator.cs} (98%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Identity8Operator.cs => Av1InverseTransformer.Identity8Operator.cs} (98%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.Operator.cs => Av1InverseTransformer.Operator.cs} (99%) rename src/ImageSharp/Formats/Heif/Av1/Transform/{Av1Inverse2dTransformer.OutputOperator.cs => Av1InverseTransformer.OutputOperator.cs} (99%) diff --git a/HEIF_IMPLEMENTATION_PLAN.md b/HEIF_IMPLEMENTATION_PLAN.md index 72f8a6bd3..024c3802d 100644 --- a/HEIF_IMPLEMENTATION_PLAN.md +++ b/HEIF_IMPLEMENTATION_PLAN.md @@ -671,7 +671,7 @@ Exit gate: Implement and verify in dependency order: - [x] HEIF item-local length-delimited NAL units, `hvcC`, VPS, SPS, PPS, and the parameter-set and slice-header syntax needed to decode the one independently coded picture carried by a supported still-image item. The production path remains item-local and exposes no Annex B byte-stream API or access-unit/timeline abstraction. Ten official Sony GENERAL Range Extensions first pictures, five real HEIC item payloads, and five public HEIC presentation cases pass exactly in Release: 20 cases with no failures or skips. -- [x] One bounded decoder lifecycle owns only the parameter sets, current-picture state, slice/tile entropy state, and reconstructed planes required by that image item. Every allocator-backed child constructor and the owning picture decoder now unwind unpublished rents in reverse order. Focused tests exercise every constructor allocation-failure position and a complete real HEIC reconstruction through 2 KiB allocator groups with balanced exactly-once returns; all 22 official native-plane, real-item, ownership, constrained-allocation, and public presentation cases pass without failures or skips. Both Release source targets build with zero warnings and errors, the scoped Release test-project analyzer build completes with zero errors and 1,011 repository warnings, Roslynk reports zero compiler errors, and `git diff --check` is clean. +- [x] One bounded decoder lifecycle owns only the parameter sets, current-picture state, slice/tile entropy state, and reconstructed planes required by that image item. Every allocator-backed child constructor and the owning picture decoder now unwind unpublished rents in reverse order. Focused tests exercise every constructor allocation-failure position and a complete real HEIC reconstruction through 2 KiB allocator groups with balanced exactly-once returns; all 22 official native-plane, real-item, ownership, constrained-allocation, and public presentation cases pass without failures or skips. Both Release source targets build with zero warnings and errors, the scoped Release test-project analyzer build completes with zero errors and 1,011 repository warnings, Roslynk reports zero compiler errors, and `git diff --check` is clean. Commit `b6ba2dbf2f90c7b0a5d9da4e9f45d045bbce1a65` records the syntax reconciliation and lifecycle correction. - [ ] CABAC arithmetic decoding and every required context transition. - [ ] Coding-tree, coding-unit, prediction-unit, and transform-unit traversal across all permitted sizes and partition modes. - [ ] Intra prediction for every luma and chroma mode, including strong intra smoothing and constrained prediction rules. @@ -856,6 +856,7 @@ No valid HEVC or AV1 color, compression, or bit-depth row may remain `unsupporte - Keep changes vertical and reviewable. A slice should add one behavior, its focused tests, independent evidence, and any required notice update. - Keep every AV1 prediction family on the established JPEG color-converter operator architecture. Each distinct traversal contract owns a family-named predictor type; its `.Operator.cs` defines the static interface, and its family-named files own the closed generic widest-to-narrowest SIMD traversal. Semantic `readonly struct` operators implement scalar, `Vector128`, `Vector256`, and `Vector512` arithmetic through that contract. Only modes which share the same traversal and contract may share a predictor family; do not nest a separate predictor beneath a broad intra/inter family or create hardware-width-specific class hierarchies. +- Keep AV1 forward and inverse transform operators under their family-named `Av1ForwardTransformer` and `Av1InverseTransformer` owners, matching the JPEG color-converter operator architecture. Their `.Operator.cs` files own the static contracts and generic dispatch, while the family-named operator files own each DCT, ADST, identity, and reconstruction-output implementation. Do not nest one-dimensional transform operators beneath a two-dimensional helper or name operator files after an implementation-detail dispatcher. - Design SIMD-suitable codec work SIMD-first. Establish vector-friendly storage, operator boundaries, scratch ownership, traversal, every applicable lane width, and benchmark-gated dispatch before implementing the equivalent scalar fallback; never build a scalar production architecture and bolt SIMD onto it later. - Inspect every owning method and upstream invariant before adding guards. Validate external file data at the parser/model boundary and rely on those established invariants internally. - Do not extract one-use helpers merely to label code. Extract shared primitives only when they have genuine reuse or remove substantial complexity. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Adst16Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Adst16Operator.cs similarity index 99% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Adst16Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Adst16Operator.cs index c0b6ef9bd..5cdcc1c47 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Adst16Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Adst16Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the sixteen-point asymmetric discrete sine inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the 16-point AV1 inverse asymmetric discrete sine transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Adst4Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Adst4Operator.cs similarity index 99% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Adst4Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Adst4Operator.cs index 30c0c132a..50e1db2de 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Adst4Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Adst4Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the four-point asymmetric discrete sine inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the four-point AV1 inverse asymmetric discrete sine transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Adst8Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Adst8Operator.cs similarity index 99% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Adst8Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Adst8Operator.cs index 860bd8683..5340275bf 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Adst8Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Adst8Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the eight-point asymmetric discrete sine inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the eight-point AV1 inverse asymmetric discrete sine transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct16Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct16Operator.cs similarity index 99% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct16Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct16Operator.cs index 45fff6b79..32aa7525a 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct16Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct16Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the sixteen-point discrete cosine inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the 16-point AV1 inverse discrete cosine transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct32Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct32Operator.cs similarity index 99% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct32Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct32Operator.cs index 2b12ee021..798af9fa7 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct32Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct32Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the thirty-two-point discrete cosine inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the 32-point AV1 inverse discrete cosine transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct4Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct4Operator.cs similarity index 99% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct4Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct4Operator.cs index 9c8e2feaa..cc5f71931 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct4Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct4Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the four-point discrete cosine inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the four-point AV1 inverse discrete cosine transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct64Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct64Operator.cs similarity index 99% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct64Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct64Operator.cs index e8ee0b417..749d85ec3 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct64Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct64Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the sixty-four-point discrete cosine inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the 64-point AV1 inverse discrete cosine transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct8Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct8Operator.cs similarity index 99% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct8Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct8Operator.cs index ebb291fbb..51602a17b 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Dct8Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Dct8Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the eight-point discrete cosine inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the eight-point AV1 inverse discrete cosine transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity16Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity16Operator.cs similarity index 98% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity16Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity16Operator.cs index bd4c44f54..0837861e9 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity16Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity16Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the sixteen-point identity inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the sixteen-point AV1 inverse identity transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity32Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity32Operator.cs similarity index 98% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity32Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity32Operator.cs index 68b547ab5..331ebb283 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity32Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity32Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the thirty-two-point identity inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the thirty-two-point AV1 inverse identity transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity4Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity4Operator.cs similarity index 98% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity4Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity4Operator.cs index 53ea2cc99..59830776d 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity4Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity4Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the four-point identity inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the four-point AV1 inverse identity transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity8Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity8Operator.cs similarity index 98% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity8Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity8Operator.cs index 645e58e2d..66914e53f 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Identity8Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Identity8Operator.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the eight-point identity inverse transform operator. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Defines the eight-point AV1 inverse identity transform operator. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Operator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Operator.cs similarity index 99% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Operator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Operator.cs index eedb48e77..5ee2f1249 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.Operator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.Operator.cs @@ -16,7 +16,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// cross-lane permutations. Reconstruction adds the final residuals to their matching prediction lanes before /// narrowing to the decoded sample depth. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// The signed stage width whose fixed-point terminal operations require widened SIMD intermediates. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.OutputOperator.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.OutputOperator.cs similarity index 99% rename from src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.OutputOperator.cs rename to src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.OutputOperator.cs index 738caeab6..c47445aff 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.OutputOperator.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.OutputOperator.cs @@ -10,7 +10,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Provides the sample-output operator shared by inverse transform traversals. /// -internal static partial class Av1Inverse2dTransformer +internal static partial class Av1InverseTransformer { /// /// Reconstructs AV1 samples from predicted values and inverse-transform residuals. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.cs index 5ba9ca4c8..852ac8e73 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformer.cs @@ -6,7 +6,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; /// /// Reconstructs decoded AV1 transform coefficients into prediction sample buffers. /// -internal class Av1InverseTransformer +internal static partial class Av1InverseTransformer { /// /// Reconstructs an eight-bit transform block in place by adding its inverse-transform residual. diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformerFactory.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformerFactory.cs index 257857443..c792c96e7 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformerFactory.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformerFactory.cs @@ -49,7 +49,7 @@ internal static class Av1InverseTransformerFactory transformFunctionParameters.TransformSize, transformFunctionParameters.BitDepth); - Av1Inverse2dTransformer.Transform2dAdd(coefficients, readBuffer, readStride, writeBuffer, writeStride, ref config, workspace); + Av1InverseTransformer.Transform2dAdd(coefficients, readBuffer, readStride, writeBuffer, writeStride, ref config, workspace); } /// @@ -93,6 +93,6 @@ internal static class Av1InverseTransformerFactory transformFunctionParameters.TransformSize, transformFunctionParameters.BitDepth); - Av1Inverse2dTransformer.Transform2dAdd(coefficients, readBuffer, readStride, writeBuffer, writeStride, ref config, workspace, transformFunctionParameters.BitDepth); + Av1InverseTransformer.Transform2dAdd(coefficients, readBuffer, readStride, writeBuffer, writeStride, ref config, workspace, transformFunctionParameters.BitDepth); } } diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseWalshHadamardTransformer.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseWalshHadamardTransformer.cs index 386770c66..921f449e6 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseWalshHadamardTransformer.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseWalshHadamardTransformer.cs @@ -40,7 +40,7 @@ internal static class Av1InverseWalshHadamardTransformer int writeStride, int coefficientCount, Span workspace) - => TransformAdd>( + => TransformAdd>( coefficients, readBuffer, readStride, @@ -70,7 +70,7 @@ internal static class Av1InverseWalshHadamardTransformer int coefficientCount, Span workspace, int bitDepth) - => TransformAdd>( + => TransformAdd>( coefficients, readBuffer, readStride, @@ -93,7 +93,7 @@ internal static class Av1InverseWalshHadamardTransformer Span workspace, int bitDepth) where TSample : unmanaged - where TOutputOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransformOutputOperator + where TOutputOperator : struct, Av1InverseTransformer.IAv1InverseTransformOutputOperator { if (Vector128.IsHardwareAccelerated) { @@ -116,7 +116,7 @@ internal static class Av1InverseWalshHadamardTransformer int coefficientCount, int bitDepth) where TSample : unmanaged - where TOutputOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransformOutputOperator + where TOutputOperator : struct, Av1InverseTransformer.IAv1InverseTransformOutputOperator { ref int coefficientBase = ref MemoryMarshal.GetReference(coefficients); Vector128 row0; @@ -172,7 +172,7 @@ internal static class Av1InverseWalshHadamardTransformer Span workspace, int bitDepth) where TSample : unmanaged - where TOutputOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransformOutputOperator + where TOutputOperator : struct, Av1InverseTransformer.IAv1InverseTransformOutputOperator { ref TSample readBase = ref MemoryMarshal.GetReference(readBuffer); ref TSample writeBase = ref MemoryMarshal.GetReference(writeBuffer); @@ -300,7 +300,7 @@ internal static class Av1InverseWalshHadamardTransformer Vector128 row3, int bitDepth) where TSample : unmanaged - where TOutputOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransformOutputOperator + where TOutputOperator : struct, Av1InverseTransformer.IAv1InverseTransformOutputOperator { ref TSample readBase = ref MemoryMarshal.GetReference(readBuffer); ref TSample writeBase = ref MemoryMarshal.GetReference(writeBuffer); diff --git a/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1InverseTransformTests.cs b/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1InverseTransformTests.cs index 2da220186..b255cd041 100644 --- a/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1InverseTransformTests.cs +++ b/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1InverseTransformTests.cs @@ -53,11 +53,11 @@ public class Av1InverseTransformTests /// private static void AssertDctOperatorParity() { - AssertOperatorParity(4); - AssertOperatorParity(8); - AssertOperatorParity(16); - AssertOperatorParity(32); - AssertOperatorParity(64); + AssertOperatorParity(4); + AssertOperatorParity(8); + AssertOperatorParity(16); + AssertOperatorParity(32); + AssertOperatorParity(64); } /// @@ -65,9 +65,9 @@ public class Av1InverseTransformTests /// private static void AssertAdstOperatorParity() { - AssertOperatorParity(4); - AssertOperatorParity(8); - AssertOperatorParity(16); + AssertOperatorParity(4); + AssertOperatorParity(8); + AssertOperatorParity(16); } /// @@ -75,10 +75,10 @@ public class Av1InverseTransformTests /// private static void AssertIdentityOperatorParity() { - AssertOperatorParity(4); - AssertOperatorParity(8); - AssertOperatorParity(16); - AssertOperatorParity(32); + AssertOperatorParity(4); + AssertOperatorParity(8); + AssertOperatorParity(16); + AssertOperatorParity(32); } /// @@ -108,14 +108,14 @@ public class Av1InverseTransformTests Av1TransformVector> adstOutput256 = default; Av1TransformVector> adstStep256 = default; - Av1Inverse2dTransformer.Adst4Operator.Transform( + Av1InverseTransformer.Adst4Operator.Transform( ref adstInput128, ref adstOutput128, ref adstStep128, cosBit, stageRange); - Av1Inverse2dTransformer.Adst4Operator.Transform( + Av1InverseTransformer.Adst4Operator.Transform( ref adstInput256, ref adstOutput256, ref adstStep256, @@ -148,7 +148,7 @@ public class Av1InverseTransformTests 262_143, -262_144); - AssertWidenedIdentityOperator( + AssertWidenedIdentityOperator( 4, identityInput128, Vector128.Create(741_503, -741_504, 741_501, -741_503), @@ -156,7 +156,7 @@ public class Av1InverseTransformTests Vector256.Create(741_503, -741_504, 741_501, -741_503, 524_322, -524_323, 370_751, -370_752), stageRange); - AssertWidenedIdentityOperator( + AssertWidenedIdentityOperator( 16, identityInput128, Vector128.Create(1_483_005, -1_483_008, 1_483_002, -1_483_005), @@ -182,7 +182,7 @@ public class Av1InverseTransformTests Vector256 input256, Vector256 expected256, Av1TransformStageRange stageRange) - where TOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransform1dOperator + where TOperator : struct, Av1InverseTransformer.IAv1InverseTransform1dOperator { const int cosBit = 12; Av1TransformVector> values128 = default; @@ -268,18 +268,18 @@ public class Av1InverseTransformTests [Fact] public void ForwardAndInverseOperatorPairsReconstructTheirInput() { - AssertRoundTrip(Av1TransformType.DctDct, Av1TransformSize.Size4x4, 1, 1); - AssertRoundTrip(Av1TransformType.DctDct, Av1TransformSize.Size8x8, 2, 2); - AssertRoundTrip(Av1TransformType.DctDct, Av1TransformSize.Size16x16, 3, 3); - AssertRoundTrip(Av1TransformType.DctDct, Av1TransformSize.Size32x32, 4, 4); - AssertRoundTrip(Av1TransformType.DctDct, Av1TransformSize.Size64x64, 5, 5); - AssertRoundTrip(Av1TransformType.AdstAdst, Av1TransformSize.Size4x4, 1, 1); - AssertRoundTrip(Av1TransformType.AdstAdst, Av1TransformSize.Size8x8, 2, 2); - AssertRoundTrip(Av1TransformType.AdstAdst, Av1TransformSize.Size16x16, 3, 3); - AssertRoundTrip(Av1TransformType.Identity, Av1TransformSize.Size4x4, 1, 1); - AssertRoundTrip(Av1TransformType.Identity, Av1TransformSize.Size8x8, 2, 1); - AssertRoundTrip(Av1TransformType.Identity, Av1TransformSize.Size16x16, 3, 1); - AssertRoundTrip(Av1TransformType.Identity, Av1TransformSize.Size32x32, 4, 1); + AssertRoundTrip(Av1TransformType.DctDct, Av1TransformSize.Size4x4, 1, 1); + AssertRoundTrip(Av1TransformType.DctDct, Av1TransformSize.Size8x8, 2, 2); + AssertRoundTrip(Av1TransformType.DctDct, Av1TransformSize.Size16x16, 3, 3); + AssertRoundTrip(Av1TransformType.DctDct, Av1TransformSize.Size32x32, 4, 4); + AssertRoundTrip(Av1TransformType.DctDct, Av1TransformSize.Size64x64, 5, 5); + AssertRoundTrip(Av1TransformType.AdstAdst, Av1TransformSize.Size4x4, 1, 1); + AssertRoundTrip(Av1TransformType.AdstAdst, Av1TransformSize.Size8x8, 2, 2); + AssertRoundTrip(Av1TransformType.AdstAdst, Av1TransformSize.Size16x16, 3, 3); + AssertRoundTrip(Av1TransformType.Identity, Av1TransformSize.Size4x4, 1, 1); + AssertRoundTrip(Av1TransformType.Identity, Av1TransformSize.Size8x8, 2, 1); + AssertRoundTrip(Av1TransformType.Identity, Av1TransformSize.Size16x16, 3, 1); + AssertRoundTrip(Av1TransformType.Identity, Av1TransformSize.Size32x32, 4, 1); } /// @@ -596,7 +596,7 @@ public class Av1InverseTransformTests /// The inverse transform operator. /// The transform length. private static void AssertOperatorParity(int length) - where TOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransform1dOperator + where TOperator : struct, Av1InverseTransformer.IAv1InverseTransform1dOperator { const int cosBit = 12; Av1TransformStageRange stageRange = default; @@ -671,7 +671,7 @@ public class Av1InverseTransformTests /// The maximum permitted reconstruction error. private static void AssertRoundTrip(Av1TransformType transformType, Av1TransformSize transformSize, int scaleLog2, int allowedError) where TForwardOperator : struct, Av1ForwardTransformer.IAv1ForwardTransform1dOperator - where TInverseOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransform1dOperator + where TInverseOperator : struct, Av1InverseTransformer.IAv1InverseTransform1dOperator { const int bitDepth = 10; const int testBlockCount = 30; @@ -730,40 +730,40 @@ public class Av1InverseTransformTests switch (config.TransformFunctionTypeColumn) { case Av1TransformFunctionType.Dct4: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Dct8: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Dct16: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Dct32: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Dct64: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Adst4: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Adst8: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Adst16: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Identity4: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Identity8: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Identity16: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Identity32: - DispatchRow(transformType, transformSize, bitDepth, ref config); + DispatchRow(transformType, transformSize, bitDepth, ref config); break; default: Assert.Fail($"Unexpected column function {config.TransformFunctionTypeColumn} for {transformType} {transformSize}."); @@ -784,45 +784,45 @@ public class Av1InverseTransformTests Av1TransformSize transformSize, int bitDepth, ref Av1Transform2dFlipConfiguration config) - where TColumnOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransform1dOperator + where TColumnOperator : struct, Av1InverseTransformer.IAv1InverseTransform1dOperator { switch (config.TransformFunctionTypeRow) { case Av1TransformFunctionType.Dct4: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Dct8: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Dct16: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Dct32: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Dct64: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Adst4: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Adst8: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Adst16: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Identity4: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Identity8: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Identity16: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; case Av1TransformFunctionType.Identity32: - AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); + AssertTransform2dParity(transformType, transformSize, bitDepth, ref config); break; default: Assert.Fail($"Unexpected row function {config.TransformFunctionTypeRow} for {transformType} {transformSize}."); @@ -844,8 +844,8 @@ public class Av1InverseTransformTests Av1TransformSize transformSize, int bitDepth, ref Av1Transform2dFlipConfiguration config) - where TColumnOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransform1dOperator - where TRowOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransform1dOperator + where TColumnOperator : struct, Av1InverseTransformer.IAv1InverseTransform1dOperator + where TRowOperator : struct, Av1InverseTransformer.IAv1InverseTransform1dOperator { int width = transformSize.GetWidth(); int height = transformSize.GetHeight(); @@ -895,8 +895,8 @@ public class Av1InverseTransformTests int[] coefficients, Av1TransformSize transformSize, ref Av1Transform2dFlipConfiguration config) - where TColumnOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransform1dOperator - where TRowOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransform1dOperator + where TColumnOperator : struct, Av1InverseTransformer.IAv1InverseTransform1dOperator + where TRowOperator : struct, Av1InverseTransformer.IAv1InverseTransform1dOperator { const int bitDepth = 8; int width = transformSize.GetWidth(); @@ -921,10 +921,10 @@ public class Av1InverseTransformTests Array.Fill(scalar, byte.MaxValue); Array.Fill(vector128, byte.MaxValue); - Av1Inverse2dTransformer.Transform2dScalar, TColumnOperator, TRowOperator>( + Av1InverseTransformer.Transform2dScalar, TColumnOperator, TRowOperator>( coefficients, prediction, readStride, scalar, writeStride, ref config, scalarWorkspace, bitDepth); - Av1Inverse2dTransformer.Transform2dVector128, TColumnOperator, TRowOperator>( + Av1InverseTransformer.Transform2dVector128, TColumnOperator, TRowOperator>( coefficients, prediction, readStride, vector128, writeStride, ref config, vector128Workspace, bitDepth); Assert.Equal(scalar, vector128); @@ -935,7 +935,7 @@ public class Av1InverseTransformTests int[] vector256Workspace = new int[workspaceLength]; Array.Fill(vector256, byte.MaxValue); - Av1Inverse2dTransformer.Transform2dVector256, TColumnOperator, TRowOperator>( + Av1InverseTransformer.Transform2dVector256, TColumnOperator, TRowOperator>( coefficients, prediction, readStride, vector256, writeStride, ref config, vector256Workspace, bitDepth); Assert.Equal(scalar, vector256); @@ -956,8 +956,8 @@ public class Av1InverseTransformTests Av1TransformSize transformSize, int bitDepth, ref Av1Transform2dFlipConfiguration config) - where TColumnOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransform1dOperator - where TRowOperator : struct, Av1Inverse2dTransformer.IAv1InverseTransform1dOperator + where TColumnOperator : struct, Av1InverseTransformer.IAv1InverseTransform1dOperator + where TRowOperator : struct, Av1InverseTransformer.IAv1InverseTransform1dOperator { int width = transformSize.GetWidth(); int height = transformSize.GetHeight(); @@ -982,10 +982,10 @@ public class Av1InverseTransformTests Array.Fill(scalar, short.MinValue); Array.Fill(vector128, short.MinValue); - Av1Inverse2dTransformer.Transform2dScalar, TColumnOperator, TRowOperator>( + Av1InverseTransformer.Transform2dScalar, TColumnOperator, TRowOperator>( coefficients, prediction, readStride, scalar, writeStride, ref config, scalarWorkspace, bitDepth); - Av1Inverse2dTransformer.Transform2dVector128, TColumnOperator, TRowOperator>( + Av1InverseTransformer.Transform2dVector128, TColumnOperator, TRowOperator>( coefficients, prediction, readStride, vector128, writeStride, ref config, vector128Workspace, bitDepth); Assert.Equal(scalar, vector128); @@ -996,7 +996,7 @@ public class Av1InverseTransformTests int[] vector256Workspace = new int[workspaceLength]; Array.Fill(vector256, short.MinValue); - Av1Inverse2dTransformer.Transform2dVector256, TColumnOperator, TRowOperator>( + Av1InverseTransformer.Transform2dVector256, TColumnOperator, TRowOperator>( coefficients, prediction, readStride, vector256, writeStride, ref config, vector256Workspace, bitDepth); Assert.Equal(scalar, vector256);