diff --git a/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigComponent.cs b/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigComponent.cs
index e2f21bd1c..8445625bd 100644
--- a/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigComponent.cs
+++ b/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigComponent.cs
@@ -57,7 +57,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort.Components.Decoder
///
/// The to use for buffer allocations.
/// The instance
- public void InitializeDerivedData(MemoryManager memoryManager, OrigJpegDecoderCore decoder)
+ /// Whether to decode metadata only. If this is true, memory allocation for SpectralBlocks will not be necessary
+ public void InitializeDerivedData(MemoryManager memoryManager, OrigJpegDecoderCore decoder, bool metadataOnly)
{
// For 4-component images (either CMYK or YCbCrK), we only support two
// hv vectors: [0x11 0x11 0x11 0x11] and [0x22 0x11 0x11 0x22].
@@ -80,7 +81,10 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort.Components.Decoder
this.SubSamplingDivisors = c0.SamplingFactors.DivideBy(this.SamplingFactors);
}
- this.SpectralBlocks = memoryManager.Allocate2D(this.SizeInBlocks.Width, this.SizeInBlocks.Height, true);
+ if (!metadataOnly)
+ {
+ this.SpectralBlocks = memoryManager.Allocate2D(this.SizeInBlocks.Width, this.SizeInBlocks.Height, true);
+ }
}
///
@@ -246,7 +250,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort.Components.Decoder
public void Dispose()
{
- this.SpectralBlocks.Dispose();
+ this.SpectralBlocks?.Dispose();
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegDecoderCore.cs
index a4fbb17be..66b4601da 100644
--- a/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegDecoderCore.cs
+++ b/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegDecoderCore.cs
@@ -41,7 +41,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort
///
/// Encapsulates stream reading and processing data and operations for .
- /// It's a value type for imporved data locality, and reduced number of CALLVIRT-s
+ /// It's a value type for improved data locality, and reduced number of CALLVIRT-s
///
public InputProcessor InputProcessor;
#pragma warning restore SA401
@@ -168,7 +168,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort
public int MCUCountY => this.ImageSizeInMCU.Height;
///
- /// Gets the the total number of MCU-s (Minimum Coded Units) in the image.
+ /// Gets the total number of MCU-s (Minimum Coded Units) in the image.
///
public int TotalMCUCount => this.MCUCountX * this.MCUCountY;
@@ -331,7 +331,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort
case OrigJpegConstants.Markers.SOF1:
case OrigJpegConstants.Markers.SOF2:
this.IsProgressive = marker == OrigJpegConstants.Markers.SOF2;
- this.ProcessStartOfFrameMarker(remaining);
+ this.ProcessStartOfFrameMarker(remaining, metadataOnly);
if (metadataOnly && this.isJFif)
{
return;
@@ -634,7 +634,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort
/// Processes the Start of Frame marker. Specified in section B.2.2.
///
/// The remaining bytes in the segment block.
- private void ProcessStartOfFrameMarker(int remaining)
+ /// Whether to decode metadata only.
+ private void ProcessStartOfFrameMarker(int remaining, bool metadataOnly)
{
if (this.ComponentCount != 0)
{
@@ -689,12 +690,12 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort
this.ImageSizeInMCU = this.ImageSizeInPixels.DivideRoundUp(8 * h0, 8 * v0);
+ this.ColorSpace = this.DeduceJpegColorSpace();
+
foreach (OrigComponent component in this.Components)
{
- component.InitializeDerivedData(this.configuration.MemoryManager, this);
+ component.InitializeDerivedData(this.configuration.MemoryManager, this, metadataOnly);
}
-
- this.ColorSpace = this.DeduceJpegColorSpace();
}
///