Browse Source

Move, add entropy coding common functions

pull/3153/head
winscripter 1 month ago
parent
commit
2758454c1b
  1. 2
      src/ImageSharp/Formats/Jxl/Fields/JxlU32Coder.cs
  2. 2
      src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsConstants.cs
  3. 2
      src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsEntry.cs
  4. 2
      src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsHelper.cs
  5. 2
      src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsHybridUIntConfiguration.cs
  6. 2
      src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsLz77Parameters.cs
  7. 2
      src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsSymbol.cs
  8. 2
      src/ImageSharp/Formats/Jxl/IO/FrameHeader/JxlFrameHeader.cs
  9. 9
      src/ImageSharp/Formats/Jxl/IO/JxlHuffman.cs
  10. 20
      src/ImageSharp/Formats/Jxl/IO/JxlHuffmanCode.cs
  11. 3
      src/ImageSharp/Formats/Jxl/Processing/Decoder/JxlAnsReader.cs
  12. 2
      src/ImageSharp/Formats/Jxl/Processing/Decoder/JxlBitReader.cs
  13. 2
      src/ImageSharp/Formats/Jxl/Processing/JxlAspectRatioHelpers.cs
  14. 4
      src/ImageSharp/Formats/Jxl/Processing/JxlBlockContextMap.cs
  15. 120
      src/ImageSharp/Formats/Jxl/Processing/JxlEntropyCoder.cs
  16. 2
      src/ImageSharp/Formats/Jxl/Processing/JxlFrameDimensions.cs
  17. 2
      src/ImageSharp/Formats/Jxl/Processing/Splines/JxlControlPoint.cs
  18. 2
      src/ImageSharp/Formats/Jxl/Processing/Splines/JxlQuantizedSpline.cs
  19. 2
      src/ImageSharp/Formats/Jxl/Processing/Splines/JxlSpline.cs
  20. 2
      src/ImageSharp/Formats/Jxl/Processing/Splines/JxlSplineDataView.cs
  21. 2
      src/ImageSharp/Formats/Jxl/Processing/Splines/JxlSplineEntropyContext.cs
  22. 2
      src/ImageSharp/Formats/Jxl/Processing/Splines/JxlSplineSegment.cs
  23. 2
      src/ImageSharp/Formats/Jxl/Processing/Splines/JxlSplineSegmentSpan.cs

2
src/ImageSharp/Formats/Jxl/Fields/JxlU32Coder.cs

@ -2,7 +2,7 @@
// Licensed under the Six Labors Split License.
using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.Formats.Jxl.IO;
using SixLabors.ImageSharp.Formats.Jxl.Processing.Decoder;
namespace SixLabors.ImageSharp.Formats.Jxl.Fields;

2
src/ImageSharp/Formats/Jxl/IO/JxlAnsConstants.cs → src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsConstants.cs

@ -1,7 +1,7 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
namespace SixLabors.ImageSharp.Formats.Jxl.IO.Entropy;
internal static class JxlAnsConstants
{

2
src/ImageSharp/Formats/Jxl/IO/JxlAnsEntry.cs → src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsEntry.cs

@ -3,7 +3,7 @@
using System.Runtime.InteropServices;
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
namespace SixLabors.ImageSharp.Formats.Jxl.IO.Entropy;
[StructLayout(LayoutKind.Sequential)]
internal struct JxlAnsEntry

2
src/ImageSharp/Formats/Jxl/IO/JxlAnsHelper.cs → src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsHelper.cs

@ -5,7 +5,7 @@ using System.Buffers;
using System.Diagnostics;
using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
namespace SixLabors.ImageSharp.Formats.Jxl.IO.Entropy;
internal static class JxlAnsHelper
{

2
src/ImageSharp/Formats/Jxl/IO/JxlAnsHybridUIntConfiguration.cs → src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsHybridUIntConfiguration.cs

@ -4,7 +4,7 @@
using System.Diagnostics;
using SixLabors.ImageSharp.Formats.Jxl.Fields;
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
namespace SixLabors.ImageSharp.Formats.Jxl.IO.Entropy;
internal sealed class JxlAnsHybridUIntConfiguration : IJxlFields
{

2
src/ImageSharp/Formats/Jxl/IO/JxlAnsLz77Parameters.cs → src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsLz77Parameters.cs

@ -3,7 +3,7 @@
using SixLabors.ImageSharp.Formats.Jxl.Fields;
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
namespace SixLabors.ImageSharp.Formats.Jxl.IO.Entropy;
internal sealed class JxlAnsLz77Parameters : IJxlFields
{

2
src/ImageSharp/Formats/Jxl/IO/JxlAnsSymbol.cs → src/ImageSharp/Formats/Jxl/IO/Entropy/JxlAnsSymbol.cs

@ -3,7 +3,7 @@
using System.Runtime.InteropServices;
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
namespace SixLabors.ImageSharp.Formats.Jxl.IO.Entropy;
[StructLayout(LayoutKind.Sequential)]
internal struct JxlAnsSymbol(int value, int offset, int frequency)

2
src/ImageSharp/Formats/Jxl/IO/FrameHeader/JxlFrameHeader.cs

@ -7,7 +7,7 @@
#pragma warning disable IDE0032 // Use auto property
using SixLabors.ImageSharp.Formats.Jxl.Fields;
using SixLabors.ImageSharp.Formats.Jxl.Metadata;
using SixLabors.ImageSharp.Formats.Jxl.IO.Metadata;
using SixLabors.ImageSharp.Formats.Jxl.Processing;
namespace SixLabors.ImageSharp.Formats.Jxl.IO.FrameHeader;

9
src/ImageSharp/Formats/Jxl/IO/JxlHuffman.cs

@ -0,0 +1,9 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
internal static class JxlHuffman
{
}

20
src/ImageSharp/Formats/Jxl/IO/JxlHuffmanCode.cs

@ -0,0 +1,20 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
/// <summary>
/// A single Huffman code.
/// </summary>
internal struct JxlHuffmanCode
{
/// <summary>
/// Number of bits for this symbol.
/// </summary>
public byte Bits;
/// <summary>
/// Symbol value/offset.
/// </summary>
public ushort Value;
}

3
src/ImageSharp/Formats/Jxl/IO/JxlAnsReader.cs → src/ImageSharp/Formats/Jxl/Processing/Decoder/JxlAnsReader.cs

@ -3,8 +3,9 @@
using System.Buffers;
using System.Diagnostics;
using SixLabors.ImageSharp.Formats.Jxl.IO;
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing.Decoder;
internal static class JxlAnsReader
{

2
src/ImageSharp/Formats/Jxl/IO/JxlBitReader.cs → src/ImageSharp/Formats/Jxl/Processing/Decoder/JxlBitReader.cs

@ -4,7 +4,7 @@
using System.Buffers.Binary;
using System.Diagnostics;
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing.Decoder;
/// <summary>
/// Represents a bitstream reader.

2
src/ImageSharp/Formats/Jxl/JxlAspectRatioHelpers.cs → src/ImageSharp/Formats/Jxl/Processing/JxlAspectRatioHelpers.cs

@ -3,7 +3,7 @@
using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.Formats.Jxl;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing;
internal static class JxlAspectRatioHelpers
{

4
src/ImageSharp/Formats/Jxl/Processing/JxlBlockContextMap.cs

@ -23,9 +23,9 @@ internal sealed class JxlBlockContextMap
public List<int>[] DcThresholds { get; } = [[], [], []];
public List<uint> QfThresholds { get; } = [];
public List<uint> QfThresholds { get; set; } = [];
public byte[] ContextMap { get; } = new byte[DefaultContextMap.Length];
public byte[] ContextMap { get; set; } = new byte[DefaultContextMap.Length];
public int ContextCount { get; set; }

120
src/ImageSharp/Formats/Jxl/Processing/JxlEntropyCoder.cs

@ -0,0 +1,120 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using SixLabors.ImageSharp.Formats.Jxl.Fields;
using SixLabors.ImageSharp.Formats.Jxl.Processing.Decoder;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing;
/// <summary>
/// Helper functions for use in entropy coding.
/// </summary>
internal static class JxlEntropyCoder
{
/// <summary>
/// Global DC threshold distributions
/// </summary>
public static readonly JxlU32Enc DcThresholdDistributions = new(
JxlFieldExpressions.Bits(4),
JxlFieldExpressions.BitsOffset(8, 16),
JxlFieldExpressions.BitsOffset(16, 272),
JxlFieldExpressions.BitsOffset(32, 65808));
/// <summary>
/// Global QF threshold distributions
/// </summary>
public static readonly JxlU32Enc QfThresholdDistributions = new(
JxlFieldExpressions.Bits(2),
JxlFieldExpressions.BitsOffset(3, 4),
JxlFieldExpressions.BitsOffset(5, 12),
JxlFieldExpressions.BitsOffset(8, 44));
/// <summary>
/// Predicts the entropy symbol using top and left neighboring pixels.
/// </summary>
/// <param name="rowTop">Above row; set to <see cref="Span{T}.Empty"/> if missing</param>
/// <param name="row">Current row</param>
/// <param name="x">The x coordinate offset</param>
/// <param name="defaultValue">Default value that's used if both current and above row cannot be used</param>
/// <returns>The predicted coefficient using neighboring pixels.</returns>
public static int PredictFromTopAndLeft(
ReadOnlySpan<int> rowTop,
ReadOnlySpan<int> row,
int x,
int defaultValue)
{
if (x == 0)
{
return rowTop.Length == 0 ? defaultValue : rowTop[x];
}
if (rowTop.Length == 0)
{
return row[x - 1];
}
return (rowTop[x] + rowTop[x - 1] + 1) / 2;
}
public static bool DecodeBlockContextMap(Configuration configuration, JxlBitReader reader, ref JxlBlockContextMap contextMap)
{
List<int>[] dct = contextMap.DcThresholds;
byte[] ctxMap = contextMap.ContextMap;
bool isDefaultContextMap = reader.ReadBoolean();
if (isDefaultContextMap)
{
contextMap = new();
return true;
}
contextMap.DcContextCount = 1;
for (int j = 0; j <= 2; j++)
{
int dcThresholdCount = (int)reader.ReadBits32(4u);
dct[j] = new List<int>(dcThresholdCount);
contextMap.DcContextCount = dcThresholdCount + 1;
for (int i = 0; i < dcThresholdCount; i++)
{
dct[j][i] = JxlPackSigned.UnpackSigned(JxlU32Coder.Read(DcThresholdDistributions, reader));
}
}
int qfThresholdCount = (int)reader.ReadBits32(4u);
List<uint> qft = new(qfThresholdCount);
for (int i = 0; i < qfThresholdCount; i++)
{
qft[i] = JxlU32Coder.Read(QfThresholdDistributions, reader) + 1;
}
contextMap.QfThresholds = qft;
if (contextMap.DcContextCount * qft.Count > 64)
{
throw new InvalidOperationException("Invalid block context map. It is too large.");
}
Array.Resize(ref ctxMap, 3 * JxlForwardCoefficientOrder.OrderCount * contextMap.DcContextCount * qft.Count);
contextMap.ContextMap = ctxMap;
if (!JxlDecoderCore.DecodeContextMap(configuration, ref ctxMap, contextMap.ContextCount, reader))
{
return false;
}
if (contextMap.ContextCount > 16)
{
throw new InvalidOperationException("Too many distinct contexts in block context map");
}
return true;
}
}

2
src/ImageSharp/Formats/Jxl/JxlFrameDimensions.cs → src/ImageSharp/Formats/Jxl/Processing/JxlFrameDimensions.cs

@ -3,7 +3,7 @@
using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.Formats.Jxl;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing;
internal sealed class JxlFrameDimensions
{

2
src/ImageSharp/Formats/Jxl/Splines/JxlControlPoint.cs → src/ImageSharp/Formats/Jxl/Processing/Splines/JxlControlPoint.cs

@ -3,7 +3,7 @@
using System.Runtime.InteropServices;
namespace SixLabors.ImageSharp.Formats.Jxl.Splines;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing.Splines;
/// <summary>
/// A simple pair of first and second 32-bit signed integers

2
src/ImageSharp/Formats/Jxl/Splines/JxlQuantizedSpline.cs → src/ImageSharp/Formats/Jxl/Processing/Splines/JxlQuantizedSpline.cs

@ -5,7 +5,7 @@ using System.Buffers;
using System.Diagnostics;
using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.Formats.Jxl.Splines;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing.Splines;
internal sealed class JxlQuantizedSpline : IDisposable
{

2
src/ImageSharp/Formats/Jxl/Splines/JxlSpline.cs → src/ImageSharp/Formats/Jxl/Processing/Splines/JxlSpline.cs

@ -3,7 +3,7 @@
using System.Buffers;
namespace SixLabors.ImageSharp.Formats.Jxl.Splines;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing.Splines;
internal sealed class JxlSpline : IDisposable
{

2
src/ImageSharp/Formats/Jxl/Splines/JxlSplineDataView.cs → src/ImageSharp/Formats/Jxl/Processing/Splines/JxlSplineDataView.cs

@ -1,7 +1,7 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Jxl.Splines;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing.Splines;
internal sealed class JxlSplineDataView
{

2
src/ImageSharp/Formats/Jxl/Splines/JxlSplineEntropyContext.cs → src/ImageSharp/Formats/Jxl/Processing/Splines/JxlSplineEntropyContext.cs

@ -1,7 +1,7 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Jxl.Splines;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing.Splines;
internal enum JxlSplineEntropyContext : byte
{

2
src/ImageSharp/Formats/Jxl/Splines/JxlSplineSegment.cs → src/ImageSharp/Formats/Jxl/Processing/Splines/JxlSplineSegment.cs

@ -1,7 +1,7 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Jxl.Splines;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing.Splines;
internal struct JxlSplineSegment
{

2
src/ImageSharp/Formats/Jxl/Splines/JxlSplineSegmentSpan.cs → src/ImageSharp/Formats/Jxl/Processing/Splines/JxlSplineSegmentSpan.cs

@ -1,7 +1,7 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Jxl.Splines;
namespace SixLabors.ImageSharp.Formats.Jxl.Processing.Splines;
internal struct JxlSplineSegmentSpan(int startInclusive, int endInclusive)
{
Loading…
Cancel
Save