// Copyright (c) Six Labors. // Licensed under the Six Labors Split License. using SixLabors.ImageSharp.Formats.Heif.Hevc; namespace SixLabors.ImageSharp.Tests.Formats.Heif.Hevc; /// /// Verifies HEVC luma and chroma quantization-parameter derivation. /// [Trait("Format", "Heic")] public class HevcQuantizationParametersTests { /// /// Verifies that luma quantization parameters include the precision-derived offset. /// /// The luma quantization parameter before the bit-depth offset. /// The reconstructed luma precision. /// The expected effective luma quantization parameter. [Theory] [InlineData(22, 8, 22)] [InlineData(-12, 10, 0)] [InlineData(-24, 12, 0)] [InlineData(51, 12, 75)] public void LumaIncludesBitDepthOffset(int quantizationParameter, int bitDepth, int expected) { HevcQuantizationParameters parameters = new(quantizationParameter, bitDepth, bitDepth, 1, 0, 0); Assert.Equal(expected, parameters.Luma); Assert.Equal(expected, parameters.Get(HevcPlane.Y)); } /// /// Verifies the 4:2:0 chroma mapping plateaus and the upper mapped value. /// /// The luma quantization parameter before component offsets. /// The expected effective eight-bit chroma quantization parameter. [Theory] [InlineData(29, 29)] [InlineData(30, 29)] [InlineData(35, 33)] [InlineData(37, 34)] [InlineData(43, 37)] [InlineData(51, 45)] public void Chroma420UsesNormativeMapping(int quantizationParameter, int expected) { HevcQuantizationParameters parameters = new(quantizationParameter, 8, 8, 1, 0, 0); Assert.Equal(expected, parameters.Cb); Assert.Equal(expected, parameters.Cr); } /// /// Verifies that 4:2:2 and 4:4:4 chroma quantization parameters are linear through 51 and saturate above it. /// /// The tested sequence chroma-format identifier. [Theory] [InlineData((byte)2)] [InlineData((byte)3)] public void FullResolutionMappingsSaturateAboveFiftyOne(byte chromaFormat) { HevcQuantizationParameters parameters = new(51, 8, 8, chromaFormat, 6, 6); Assert.Equal(51, parameters.Cb); Assert.Equal(51, parameters.Cr); } /// /// Verifies negative chroma values and independent combined component offsets at higher precision. /// [Fact] public void ChromaAppliesCombinedOffsetsAndBitDepthOffset() { HevcQuantizationParameters parameters = new(-8, 10, 12, 1, -8, 20); Assert.Equal(4, parameters.Luma); Assert.Equal(8, parameters.Cb); Assert.Equal(36, parameters.Cr); Assert.Equal(parameters.Cb, parameters.Get(HevcPlane.Cb)); Assert.Equal(parameters.Cr, parameters.Get(HevcPlane.Cr)); } }