diff --git a/src/ImageSharp/Formats/Jpeg/Components/Encoder/YCbCrEncoder{TPixel}.cs b/src/ImageSharp/Formats/Jpeg/Components/Encoder/YCbCrEncoder{TPixel}.cs
index d5bf797bb2..5b63d05882 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Encoder/YCbCrEncoder{TPixel}.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Encoder/YCbCrEncoder{TPixel}.cs
@@ -41,6 +41,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
///
private Block8x8F luminanceQuantTable;
+ private Block8x8F temporalBlock1;
+ private Block8x8F temporalBlock2;
+
///
/// The output stream. All attempted writes after the first error become no-ops.
///
@@ -145,11 +148,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
private void Encode444(Image pixels, CancellationToken cancellationToken)
where TPixel : unmanaged, IPixel
{
- // TODO: Need a JpegScanEncoder class or struct that encapsulates the scan-encoding implementation. (Similar to JpegScanDecoder.)
- // (Partially done with YCbCrForwardConverter)
- Block8x8F temp1 = default;
- Block8x8F temp2 = default;
-
Block8x8F onStackLuminanceQuantTable = this.luminanceQuantTable;
Block8x8F onStackChrominanceQuantTable = this.chrominanceQuantTable;
@@ -176,8 +174,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
QuantIndex.Luminance,
prevDCY,
ref pixelConverter.Y,
- ref temp1,
- ref temp2,
ref onStackLuminanceQuantTable,
ref unzig);
@@ -185,8 +181,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
QuantIndex.Chrominance,
prevDCCb,
ref pixelConverter.Cb,
- ref temp1,
- ref temp2,
ref onStackChrominanceQuantTable,
ref unzig);
@@ -194,8 +188,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
QuantIndex.Chrominance,
prevDCCr,
ref pixelConverter.Cr,
- ref temp1,
- ref temp2,
ref onStackChrominanceQuantTable,
ref unzig);
}
@@ -217,9 +209,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
Span cb = stackalloc Block8x8F[4];
Span cr = stackalloc Block8x8F[4];
- Block8x8F temp1 = default;
- Block8x8F temp2 = default;
-
Block8x8F onStackLuminanceQuantTable = this.luminanceQuantTable;
Block8x8F onStackChrominanceQuantTable = this.chrominanceQuantTable;
@@ -253,8 +242,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
QuantIndex.Luminance,
prevDCY,
ref pixelConverter.Y,
- ref temp1,
- ref temp2,
ref onStackLuminanceQuantTable,
ref unzig);
}
@@ -264,8 +251,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
QuantIndex.Chrominance,
prevDCCb,
ref b,
- ref temp1,
- ref temp2,
ref onStackChrominanceQuantTable,
ref unzig);
@@ -274,8 +259,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
QuantIndex.Chrominance,
prevDCCr,
ref b,
- ref temp1,
- ref temp2,
ref onStackChrominanceQuantTable,
ref unzig);
}
@@ -322,8 +305,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
QuantIndex.Luminance,
prevDCY,
ref pixelConverter.Y,
- ref temp1,
- ref temp2,
ref onStackLuminanceQuantTable,
ref unzig);
}
@@ -372,16 +353,17 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
QuantIndex index,
int prevDC,
ref Block8x8F src,
- ref Block8x8F tempDest1,
- ref Block8x8F tempDest2,
ref Block8x8F quant,
ref ZigZag unZig)
{
- FastFloatingPointDCT.TransformFDCT(ref src, ref tempDest1, ref tempDest2);
+ ref Block8x8F refTemp1 = ref this.temporalBlock1;
+ ref Block8x8F refTemp2 = ref this.temporalBlock2;
+
+ FastFloatingPointDCT.TransformFDCT(ref src, ref refTemp1, ref refTemp2);
- Block8x8F.Quantize(ref tempDest1, ref tempDest2, ref quant, ref unZig);
+ Block8x8F.Quantize(ref refTemp1, ref refTemp2, ref quant, ref unZig);
- int dc = (int)tempDest2[0];
+ int dc = (int)refTemp2[0];
// Emit the DC delta.
this.EmitHuffRLE((HuffIndex)((2 * (int)index) + 0), 0, dc - prevDC);
@@ -392,7 +374,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
for (int zig = 1; zig < Block8x8F.Size; zig++)
{
- int ac = (int)tempDest2[zig];
+ int ac = (int)refTemp2[zig];
if (ac == 0)
{