Browse Source

First symbol coding roundtrip

pull/2633/head
Ynse Hoornenborg 2 years ago
parent
commit
e34b83148c
  1. 10
      src/ImageSharp/Formats/Heif/Av1/Symbol/Av1SymbolReader.cs
  2. 6
      tests/ImageSharp.Tests/Formats/Heif/Av1/SymbolTest.cs

10
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;
}
}

6
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<byte> 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);

Loading…
Cancel
Save