Browse Source

Injected frame & reset interval

pull/1694/head
Dmitry Pentin 5 years ago
parent
commit
3b2d2d8c1d
  1. 37
      src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanScanDecoder.cs
  2. 6
      src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs

37
src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanScanDecoder.cs

@ -16,14 +16,36 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
/// </summary> /// </summary>
internal class HuffmanScanDecoder internal class HuffmanScanDecoder
{ {
private readonly JpegFrame frame;
private readonly HuffmanTable[] dcHuffmanTables; private readonly HuffmanTable[] dcHuffmanTables;
private readonly HuffmanTable[] acHuffmanTables; private readonly HuffmanTable[] acHuffmanTables;
private readonly BufferedReadStream stream; private readonly BufferedReadStream stream;
private readonly JpegComponent[] components;
// Frame related
private JpegFrame frame;
private JpegComponent[] components;
public JpegFrame Frame
{
set
{
frame = value;
components = value.Components;
}
}
// The restart interval. // The restart interval.
private readonly int restartInterval; private int restartInterval;
// How many mcu's are left to do.
private int todo;
public int ResetInterval
{
set
{
restartInterval = value;
todo = value;
}
}
// The number of interleaved components. // The number of interleaved components.
public int componentsLength; public int componentsLength;
@ -40,9 +62,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
// The successive approximation low bit end. // The successive approximation low bit end.
public int successiveLow; public int successiveLow;
// How many mcu's are left to do.
private int todo;
// The End-Of-Block countdown for ending the sequence prematurely when the remaining coefficients are zero. // The End-Of-Block countdown for ending the sequence prematurely when the remaining coefficients are zero.
private int eobrun; private int eobrun;
@ -69,21 +88,15 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
/// <param name="cancellationToken">The token to monitor cancellation.</param> /// <param name="cancellationToken">The token to monitor cancellation.</param>
public HuffmanScanDecoder( public HuffmanScanDecoder(
BufferedReadStream stream, BufferedReadStream stream,
JpegFrame frame,
HuffmanTable[] dcHuffmanTables, HuffmanTable[] dcHuffmanTables,
HuffmanTable[] acHuffmanTables, HuffmanTable[] acHuffmanTables,
int restartInterval,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
this.dctZigZag = ZigZag.CreateUnzigTable(); this.dctZigZag = ZigZag.CreateUnzigTable();
this.stream = stream; this.stream = stream;
this.scanBuffer = new HuffmanScanBuffer(stream); this.scanBuffer = new HuffmanScanBuffer(stream);
this.frame = frame;
this.dcHuffmanTables = dcHuffmanTables; this.dcHuffmanTables = dcHuffmanTables;
this.acHuffmanTables = acHuffmanTables; this.acHuffmanTables = acHuffmanTables;
this.components = frame.Components;
this.restartInterval = restartInterval;
this.todo = restartInterval;
this.cancellationToken = cancellationToken; this.cancellationToken = cancellationToken;
} }

6
src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs

@ -1051,12 +1051,14 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
var sd = new HuffmanScanDecoder( var sd = new HuffmanScanDecoder(
stream, stream,
this.Frame,
this.dcHuffmanTables, this.dcHuffmanTables,
this.acHuffmanTables, this.acHuffmanTables,
this.resetInterval,
cancellationToken) cancellationToken)
{ {
Frame = this.Frame,
ResetInterval = this.resetInterval,
componentsLength = selectorsCount, componentsLength = selectorsCount,
spectralStart = spectralStart, spectralStart = spectralStart,

Loading…
Cancel
Save