Browse Source

Fixed converter frame injection

pull/1694/head
Dmitry Pentin 5 years ago
parent
commit
dc4bc6e03f
  1. 26
      src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter{TPixel}.cs

26
src/ImageSharp/Formats/Jpeg/Components/Decoder/SpectralConverter{TPixel}.cs

@ -33,6 +33,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
private Buffer2D<TPixel> pixelBuffer; private Buffer2D<TPixel> pixelBuffer;
public int BlockRowsPerStep; public int BlockRowsPerStep;
private int PixelRowsPerStep; private int PixelRowsPerStep;
@ -40,42 +41,39 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
private int PixelRowCounter; private int PixelRowCounter;
public JpegFrame Frame
{
set => this.InjectFrame(value);
}
public SpectralConverter(Configuration configuration) public SpectralConverter(Configuration configuration)
{ {
this.configuration = configuration; this.configuration = configuration;
} }
private void InjectFrame(JpegFrame frame) public void InjectFrameData(JpegFrame frame, IRawJpegData jpegData)
{ {
MemoryAllocator allocator = this.configuration.MemoryAllocator; MemoryAllocator allocator = this.configuration.MemoryAllocator;
// iteration data
IJpegComponent c0 = frame.Components[0];
const int blockPixelHeight = 8;
this.BlockRowsPerStep = c0.SamplingFactors.Height;
this.PixelRowsPerStep = this.BlockRowsPerStep * blockPixelHeight;
// pixel buffer for resulting image // pixel buffer for resulting image
this.pixelBuffer = allocator.Allocate2D<TPixel>(frame.PixelWidth, frame.PixelHeight, AllocationOptions.Clean); this.pixelBuffer = allocator.Allocate2D<TPixel>(frame.PixelWidth, frame.PixelHeight, AllocationOptions.Clean);
// component processors from spectral to Rgba32 // component processors from spectral to Rgba32
var postProcessorBufferSize = new Size(c0.SizeInBlocks.Width * 8, this.PixelRowsPerStep);
this.componentProcessors = new JpegComponentPostProcessor[frame.Components.Length]; this.componentProcessors = new JpegComponentPostProcessor[frame.Components.Length];
for (int i = 0; i < this.componentProcessors.Length; i++) for (int i = 0; i < this.componentProcessors.Length; i++)
{ {
this.componentProcessors[i] = new JpegComponentPostProcessor(allocator, this, frame.Components[i]); this.componentProcessors[i] = new JpegComponentPostProcessor(allocator, jpegData, postProcessorBufferSize, frame.Components[i]);
} }
// single 'stride' rgba32 buffer for conversion between spectral and TPixel // single 'stride' rgba32 buffer for conversion between spectral and TPixel
this.rgbaBuffer = allocator.Allocate<Vector4>(frame.PixelWidth); this.rgbaBuffer = allocator.Allocate<Vector4>(frame.PixelWidth);
// color converter from Rgba32 to TPixel // color converter from Rgba32 to TPixel
this.colorConverter = JpegColorConverter.GetConverter(rawJpeg.ColorSpace, frame.Precision); this.colorConverter = JpegColorConverter.GetConverter(jpegData.ColorSpace, frame.Precision);
// iteration data
IJpegComponent c0 = frame.Components[0];
const int blockPixelHeight = 8;
this.BlockRowsPerStep = c0.SamplingFactors.Height;
this.PixelRowsPerStep = this.BlockRowsPerStep * blockPixelHeight;
} }
public override void ConvertStride() public override void ConvertStride()

Loading…
Cancel
Save