From 15e39bce3f0342ece02a407ed75460a5bff1a293 Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Tue, 6 Mar 2018 23:19:47 +0100 Subject: [PATCH] #323 JPEGSegmentImageInputStream now rewrites duplicate SOF/SOS ids. And emits warnings when it applies rewrites. --- .../imageio/plugins/jpeg/JPEGImageReader.java | 9 +- .../jpeg/JPEGSegmentImageInputStream.java | 190 ++++++++++++++---- .../JPEGSegmentStreamWarningListener.java | 13 ++ .../plugins/jpeg/JPEGImageReaderTest.java | 35 ++++ .../jpeg/JPEGSegmentImageInputStreamTest.java | 8 +- .../jpeg/duplicate-component-ids.jpg | Bin 0 -> 37513 bytes 6 files changed, 211 insertions(+), 44 deletions(-) create mode 100644 imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentStreamWarningListener.java create mode 100644 imageio/imageio-jpeg/src/test/resources/jpeg/duplicate-component-ids.jpg diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java index d26cdd2a..05b386bb 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java @@ -331,7 +331,7 @@ public final class JPEGImageReader extends ImageReaderBase { // JPEGSegmentImageInputStream that filters out/skips bad/unnecessary segments delegate.setInput(imageInput != null - ? new JPEGSegmentImageInputStream(imageInput) + ? new JPEGSegmentImageInputStream(imageInput, new JPEGSegmentStreamWarningDelegate()) : null, seekForwardOnly, ignoreMetadata); } @@ -701,6 +701,7 @@ public final class JPEGImageReader extends ImageReaderBase { this.segments = segments; if (DEBUG) { + System.out.println("segments: " + segments); System.out.println("Read metadata in " + (System.currentTimeMillis() - start) + " ms"); } } @@ -1251,6 +1252,12 @@ public final class JPEGImageReader extends ImageReaderBase { } } + private class JPEGSegmentStreamWarningDelegate implements JPEGSegmentStreamWarningListener { + @Override + public void warningOccurred(String warning) { + processWarningOccurred(warning); + } + } protected static void showIt(final BufferedImage pImage, final String pTitle) { ImageReaderBase.showIt(pImage, pTitle); } diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java index 80fe0739..b07b0823 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentImageInputStream.java @@ -36,14 +36,13 @@ import javax.imageio.stream.ImageInputStreamImpl; import java.io.EOFException; import java.io.IOException; import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; import static com.twelvemonkeys.lang.Validate.notNull; /** - * ImageInputStream implementation that filters out certain JPEG segments. + * ImageInputStream implementation that filters out or rewrites + * certain JPEG segments. * * @author Harald Kuhr * @author last modified by $Author: haraldk$ @@ -51,18 +50,29 @@ import static com.twelvemonkeys.lang.Validate.notNull; */ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { // TODO: Rewrite JPEGSegment (from metadata) to store stream pos/length, and be able to replay data, and use instead of Segment? - // TODO: Change order of segments, to make sure APP0/JFIF is always before APP14/Adobe? What about EXIF? - // TODO: Insert fake APP0/JFIF if needed by the reader? - // TODO: Sort out ICC_PROFILE issues (duplicate sequence numbers etc)? + // TODO: Support multiple JPEG streams (SOI...EOI, SOI...EOI, ...) in a single file final private ImageInputStream stream; - + final private JPEGSegmentStreamWarningListener warningListener; + + final private Set componentIds = new LinkedHashSet<>(4); + private final List segments = new ArrayList(64); private int currentSegment = -1; private Segment segment; - JPEGSegmentImageInputStream(final ImageInputStream stream) { + + JPEGSegmentImageInputStream(final ImageInputStream stream, final JPEGSegmentStreamWarningListener warningListener) { this.stream = notNull(stream, "stream"); + this.warningListener = notNull(warningListener, "warningListener"); + } + + JPEGSegmentImageInputStream(final ImageInputStream stream) { + this(stream, JPEGSegmentStreamWarningListener.NULL_LISTENER); + } + + private void processWarningOccured(final String warning) { + warningListener.warningOccurred(warning); } private Segment fetchSegment() throws IOException { @@ -104,12 +114,6 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { realPosition++; } - if (trash != 0) { - // NOTE: We previously allowed these bytes to pass through to the native reader, as it could cope - // and issued the correct warning. However, the native metadata chokes on it, so we'll mask it out. - // TODO: Issue warning from the JPEGImageReader, telling how many bytes we skipped - } - marker = 0xff00 | stream.readUnsignedByte(); // Skip over 0xff padding between markers @@ -118,6 +122,12 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { marker = 0xff00 | stream.readUnsignedByte(); } + if (trash != 0) { + // NOTE: We previously allowed these bytes to pass through to the native reader, as it could cope + // and issued the correct warning. However, the native metadata chokes on it, so we'll mask it out. + processWarningOccured(String.format("Corrupt JPEG data: %d extraneous bytes before marker 0x%02x", trash, marker & 0xff)); + } + // We are now handling all important segments ourselves, except APP1/Exif and APP14/Adobe, // as these segments affects image decoding. boolean appSegmentMarker = isAppSegmentMarker(marker); @@ -134,17 +144,8 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { segments.add(segment); } else { - long length; - - if (marker == JPEG.SOS) { - // Treat rest of stream as a single segment (scanning for EOI is too much work) - // TODO: For progressive, there will be more than one SOS... - length = Long.MAX_VALUE - realPosition; - } - else { - // Length including length field itself - length = 2 + stream.readUnsignedShort(); - } + // Length including length field itself + long length = 2 + stream.readUnsignedShort(); if (isApp14Adobe && length != 16) { // Need to rewrite this segment, so that it gets length 16 and discard the remaining bytes... @@ -156,13 +157,24 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { // multiple quality tables with varying precision) int qtInfo = stream.read(); if ((qtInfo & 0x10) == 0x10) { - // TODO: Warning! + processWarningOccured("16 bit DQT encountered"); segment = new DownsampledDQTReplacement(realPosition, segment.end(), length, qtInfo, stream); } else { segment = new Segment(marker, realPosition, segment.end(), length); } } + else if (isSOFMarker(marker)) { + // Replace duplicate SOFn component ids + byte[] data = replaceDuplicateSOFnComponentIds(marker, length); + segment = new ReplacementSegment(marker, realPosition, segment.end(), length, data); + } + else if (marker == JPEG.SOS) { + // Replace duplicate SOS component selectors + byte[] data = replaceDuplicateSOSComponentSelectors(length); + + segment = new ReplacementSegment(marker, realPosition, segment.end(), length, data); + } else { segment = new Segment(marker, realPosition, segment.end(), length); } @@ -172,6 +184,12 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { currentSegment = segments.size() - 1; + if (marker == JPEG.SOS) { + // Treat rest of stream as a single segment (scanning for EOI is too much work) + // TODO: For progressive, there will be more than one SOS... + segments.add(new Segment(-1, segment.realEnd(), segment.end(), Long.MAX_VALUE - segment.realEnd())); + } + if (streamPos >= segment.start && streamPos < segment.end()) { segment.seek(stream, streamPos); @@ -205,6 +223,76 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { return segment; } + private byte[] replaceDuplicateSOSComponentSelectors(long length) throws IOException { + // See: http://www.hackerfactor.com/blog/index.php?/archives/588-JPEG-Patches.html + byte[] data = readSegment(JPEG.SOS, (int) length, stream); + + // Detect duplicates + Set componentSelectors = new LinkedHashSet<>(4); + boolean duplicatesFound = false; + int off = 5; + while (off < length - 3) { + int selector = data[off] & 0xff; + if (!componentSelectors.add(selector)) { + processWarningOccured(String.format("Duplicate component selector %d in SOS", selector)); + duplicatesFound = true; + } + + off += 2; + } + + // Replace all with the component ids in order, as this is the most likely situation + if (duplicatesFound) { + off = 5; + + Iterator ids = componentIds.iterator(); + while (off < length - 3) { + if (ids.hasNext()) { + data[off] = (byte) (int) ids.next(); + } + // Otherwise we'll have an undefined component selector... + + off += 2; + } + } + return data; + } + + private byte[] replaceDuplicateSOFnComponentIds(int marker, long length) throws IOException { + byte[] data = readSegment(marker, (int) length, stream); + + int off = 10; + while (off < length) { + int id = data[off] & 0xff; + if (!componentIds.add(id)) { + processWarningOccured(String.format("Duplicate component ID %d in SOF", id)); + + id++; + while (!componentIds.add(id)) { + id++; + } + + data[off] = (byte) id; + } + + off += 3; + } + return data; + } + + private static byte[] readSegment(final int marker, final int length, final ImageInputStream stream) throws IOException { + byte[] data = new byte[length]; + + data[0] = (byte) ((marker >> 8) & 0xff); + data[1] = (byte) (marker & 0xff); + data[2] = (byte) (((length - 2) >> 8) & 0xff); + data[3] = (byte) ((length - 2) & 0xff); + + stream.readFully(data, 4, length - 4); + + return data; + } + private static boolean isAppSegmentWithId(final String segmentId, final ImageInputStream stream) throws IOException { notNull(segmentId, "segmentId"); @@ -261,6 +349,30 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { return marker >= JPEG.APP0 && marker <= JPEG.APP15; } + static boolean isSOFMarker(final int marker) { + switch (marker) { + case JPEG.SOF0: + case JPEG.SOF1: + case JPEG.SOF2: + case JPEG.SOF3: + + case JPEG.SOF5: + case JPEG.SOF6: + case JPEG.SOF7: + + case JPEG.SOF9: + case JPEG.SOF10: + case JPEG.SOF11: + + case JPEG.SOF13: + case JPEG.SOF14: + case JPEG.SOF15: + return true; + default: + return false; + } + } + private void repositionAsNecessary() throws IOException { if (segment == null || streamPos < segment.start || streamPos >= segment.end()) { try { @@ -380,16 +492,17 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { } private static byte[] createMarkerFixedLength(final ImageInputStream stream) throws IOException { - byte[] segmentData = new byte[16]; - - segmentData[0] = (byte) ((JPEG.APP14 >> 8) & 0xff); - segmentData[1] = (byte) (JPEG.APP14 & 0xff); - segmentData[2] = (byte) 0; - segmentData[3] = (byte) 14; - - stream.readFully(segmentData, 4, segmentData.length - 4); - - return segmentData; + return readSegment(JPEG.APP14, 16, stream); +// byte[] segmentData = new byte[16]; +// +// segmentData[0] = (byte) ((JPEG.APP14 >> 8) & 0xff); +// segmentData[1] = (byte) (JPEG.APP14 & 0xff); +// segmentData[2] = (byte) 0; +// segmentData[3] = (byte) 14; +// +// stream.readFully(segmentData, 4, segmentData.length - 4); +// +// return segmentData; } } @@ -405,11 +518,10 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl { } private static byte[] createMarkerFixedLength(final int length, final int qtInfo, final ImageInputStream stream) throws IOException { - byte[] replacementData = new byte[length]; - int numQTs = length / 128; int newSegmentLength = 2 + (1 + 64) * numQTs; // Len + (qtInfo + qtSize) * numQTs + byte[] replacementData = new byte[length]; replacementData[0] = (byte) ((JPEG.DQT >> 8) & 0xff); replacementData[1] = (byte) (JPEG.DQT & 0xff); replacementData[2] = (byte) ((newSegmentLength >> 8) & 0xff); diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentStreamWarningListener.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentStreamWarningListener.java new file mode 100644 index 00000000..9e11996e --- /dev/null +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGSegmentStreamWarningListener.java @@ -0,0 +1,13 @@ +package com.twelvemonkeys.imageio.plugins.jpeg; + +/** + * JPEGSegmentStreamWarningListener + */ +interface JPEGSegmentStreamWarningListener { + void warningOccurred(String warning); + + JPEGSegmentStreamWarningListener NULL_LISTENER = new JPEGSegmentStreamWarningListener() { + @Override + public void warningOccurred(final String warning) {} + }; +} diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java index 361890ce..46871d75 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java @@ -62,6 +62,7 @@ import static com.twelvemonkeys.imageio.util.IIOUtil.lookupProviderByName; import static org.junit.Assert.*; import static org.junit.Assume.assumeNoException; import static org.junit.Assume.assumeNotNull; +import static org.mockito.AdditionalMatchers.and; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.*; @@ -1608,10 +1609,16 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTest(10203l)); // In no case should length increase + assertThat(length, new LessOrEqual<>(10203L)); // In no case should length increase assertEquals(9607L, length); // May change, if more chunks are passed to reader... } @@ -149,7 +149,7 @@ public class JPEGSegmentImageInputStreamTest { length++; } - assertEquals(9281L, length); // Sanity check: same as file size + assertEquals(9281L, length); // Sanity check: same as file size, except..? } @Test @@ -162,7 +162,7 @@ public class JPEGSegmentImageInputStreamTest { assertEquals(JPEG.APP1, appSegments.get(0).marker()); assertEquals("Exif", appSegments.get(0).identifier()); - stream.seek(0l); + stream.seek(0L); long length = 0; while (stream.read() != -1) { diff --git a/imageio/imageio-jpeg/src/test/resources/jpeg/duplicate-component-ids.jpg b/imageio/imageio-jpeg/src/test/resources/jpeg/duplicate-component-ids.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e0bda3527db80dc14d0338930676aac7a63fecbe GIT binary patch literal 37513 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