From e34b83148cdc832e621f6e53064299dca161c2e9 Mon Sep 17 00:00:00 2001 From: Ynse Hoornenborg Date: Fri, 17 May 2024 12:35:19 +0200 Subject: [PATCH] First symbol coding roundtrip --- .../Formats/Heif/Av1/Symbol/Av1SymbolReader.cs | 10 ++++++---- tests/ImageSharp.Tests/Formats/Heif/Av1/SymbolTest.cs | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/ImageSharp/Formats/Heif/Av1/Symbol/Av1SymbolReader.cs b/src/ImageSharp/Formats/Heif/Av1/Symbol/Av1SymbolReader.cs index 542270f3f..91e00676a 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Symbol/Av1SymbolReader.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Symbol/Av1SymbolReader.cs @@ -226,16 +226,18 @@ internal ref struct Av1SymbolReader for (int i = 0; i < numberOfSymbols - 1; i++) { tmp = (i == value) ? 0 : tmp; - if (tmp < probabilities[i]) + uint p = probabilities[i]; + if (tmp < p) { - probabilities[i] -= (ushort)((probabilities[i] - tmp) >> rate); + probabilities[i] -= (ushort)((p - tmp) >> rate); } else { - probabilities[i] += (ushort)((tmp - probabilities[i]) >> rate); + probabilities[i] += (ushort)((tmp - p) >> rate); } } - probabilities[numberOfSymbols] = Math.Min(probabilities[numberOfSymbols]++, 32); + uint rate32 = probabilities[numberOfSymbols] < 32 ? 1U : 0U; + probabilities[numberOfSymbols] += rate32; } } diff --git a/tests/ImageSharp.Tests/Formats/Heif/Av1/SymbolTest.cs b/tests/ImageSharp.Tests/Formats/Heif/Av1/SymbolTest.cs index 28e53f870..99f38c118 100644 --- a/tests/ImageSharp.Tests/Formats/Heif/Av1/SymbolTest.cs +++ b/tests/ImageSharp.Tests/Formats/Heif/Av1/SymbolTest.cs @@ -185,7 +185,7 @@ public class SymbolTest Assert.Equal(expectedValues, values); } - //[Fact] + [Fact] public void RoundTripUseIntraBlockCopy() { // Assign @@ -203,9 +203,9 @@ public class SymbolTest encoder.WriteUseIntraBlockCopySymbol(writer, value); } - writer.Exit(); + using IMemoryOwner encoded = writer.Exit(); - Av1SymbolReader reader = new(output.ToArray()); + Av1SymbolReader reader = new(encoded.GetSpan()); for (int i = 0; i < values.Length; i++) { actuals[i] = decoder.ReadUseIntraBlockCopySymbol(ref reader);