From 7077473d71bff5029841bd51245d11c085e3900e Mon Sep 17 00:00:00 2001 From: Dmitry Pentin Date: Fri, 16 Jul 2021 12:57:12 +0300 Subject: [PATCH] Decoupled mcu size from the decoder, fixed SOF component bytes length check --- .../Formats/Jpeg/Components/Decoder/JpegFrame.cs | 5 +++++ src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs | 14 +++----------- .../Formats/Jpg/ParseStreamTests.cs | 6 +++--- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegFrame.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegFrame.cs index 4baaab3868..b8f88cfe0e 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegFrame.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegFrame.cs @@ -89,6 +89,11 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder /// public int McusPerColumn { get; set; } + /// + /// Gets the mcu size of the image. + /// + public Size McuSize => new Size(this.McusPerLine, this.McusPerColumn); + /// /// Gets the color depth, in number of bits per pixel. /// diff --git a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs index 04495f1721..3c48aabee0 100644 --- a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs @@ -112,11 +112,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg /// Size IImageDecoderInternals.Dimensions => this.Frame.PixelSize; - /// - /// Gets the number of MCU blocks in the image as . - /// - public Size ImageSizeInMCU { get; private set; } - /// /// Gets a value indicating whether the metadata should be ignored when the image is being decoded. /// @@ -834,6 +829,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg byte componentCount = this.temp[5]; this.ColorSpace = this.DeduceJpegColorSpace(componentCount); + this.Metadata.GetJpegMetadata().ColorType = this.ColorSpace == JpegColorSpace.Grayscale ? JpegColorType.Luminance : JpegColorType.YCbCr; + this.Frame = new JpegFrame { Extended = frameMarker.Marker == JpegConstants.Markers.SOF1, @@ -844,14 +841,12 @@ namespace SixLabors.ImageSharp.Formats.Jpeg ComponentCount = componentCount }; - this.Metadata.GetJpegMetadata().ColorType = this.ColorSpace == JpegColorSpace.Grayscale ? JpegColorType.Luminance : JpegColorType.YCbCr; - if (!metadataOnly) { remaining -= length; const int componentBytes = 3; - if (remaining > componentCount * componentBytes) + if (remaining != componentCount * componentBytes) { JpegThrowHelper.ThrowBadMarker("SOFn", remaining); } @@ -894,9 +889,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg this.Frame.MaxVerticalFactor = maxV; this.Frame.InitComponents(); - this.ImageSizeInMCU = new Size(this.Frame.McusPerLine, this.Frame.McusPerColumn); - - // This can be injected in SOF marker callback this.scanDecoder.InjectFrameData(this.Frame, this); } } diff --git a/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs index 2162ee13c6..e1307d3fc6 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs @@ -48,7 +48,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg Size expectedSizeInBlocks = decoder.ImageSizeInPixels.DivideRoundUp(8); - Assert.Equal(expectedSizeInBlocks, decoder.ImageSizeInMCU); + Assert.Equal(expectedSizeInBlocks, decoder.Frame.McuSize); var uniform1 = new Size(1, 1); JpegComponent c0 = decoder.Components[0]; @@ -70,7 +70,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg using (JpegDecoderCore decoder = JpegFixture.ParseJpegStream(imageFile)) { sb.AppendLine(imageFile); - sb.AppendLine($"Size:{decoder.ImageSizeInPixels} MCU:{decoder.ImageSizeInMCU}"); + sb.AppendLine($"Size:{decoder.ImageSizeInPixels} MCU:{decoder.Frame.McuSize}"); JpegComponent c0 = decoder.Components[0]; JpegComponent c1 = decoder.Components[1]; @@ -115,7 +115,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg var uniform1 = new Size(1, 1); - Size expectedLumaSizeInBlocks = decoder.ImageSizeInMCU.MultiplyBy(fLuma); + Size expectedLumaSizeInBlocks = decoder.Frame.McuSize.MultiplyBy(fLuma); Size divisor = fLuma.DivideBy(fChroma);