// 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));
}
}