diff --git a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEG.java b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEG.java index 8753c26e..aa9a3489 100644 --- a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEG.java +++ b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEG.java @@ -89,6 +89,6 @@ public interface JPEG { // "Adobe" APP14 // Possibly - // "http://ns.adobe.com/xap/1.0/" (XMP) - // "Photoshop 3.0" (Contains IPTC) + // "http://ns.adobe.com/xap/1.0/" (XMP) APP1 + // "Photoshop 3.0" (may contain IPTC) APP13 } diff --git a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtil.java b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtil.java index 6372737b..98a8f548 100644 --- a/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtil.java +++ b/imageio/imageio-metadata/src/main/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtil.java @@ -95,7 +95,8 @@ public final class JPEGSegmentUtil { JPEGSegment segment; try { - while (!isImageDone(segment = readSegment(stream, segmentIdentifiers))) { + do { + segment = readSegment(stream, segmentIdentifiers); // System.err.println("segment: " + segment); if (isRequested(segment, segmentIdentifiers)) { @@ -106,6 +107,7 @@ public final class JPEGSegmentUtil { segments.add(segment); } } + while (!isImageDone(segment)); } catch (EOFException ignore) { // Just end here, in case of malformed stream @@ -153,6 +155,9 @@ public final class JPEGSegmentUtil { static JPEGSegment readSegment(final ImageInputStream stream, Map> segmentIdentifiers) throws IOException { int marker = stream.readUnsignedShort(); + if ((marker >> 8 & 0xff) != 0xff) { + throw new IIOException(String.format("Bad marker: %04x", marker)); + } int length = stream.readUnsignedShort(); // Length including length field itself byte[] data; @@ -192,7 +197,7 @@ public final class JPEGSegmentUtil { @Override public boolean contains(Object o) { - return true; + return o instanceof String; } } @@ -204,13 +209,13 @@ public final class JPEGSegmentUtil { @Override public List get(Object key) { - return key instanceof Integer && JPEGSegment.isAppSegmentMarker((Integer) key) ? ALL_IDS : null; + return containsKey(key) && JPEGSegment.isAppSegmentMarker((Integer) key) ? ALL_IDS : null; } @Override public boolean containsKey(Object key) { - return true; + return key instanceof Integer; } } diff --git a/imageio/imageio-metadata/src/test/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtilTest.java b/imageio/imageio-metadata/src/test/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtilTest.java index 2a69d8b1..443341dd 100644 --- a/imageio/imageio-metadata/src/test/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtilTest.java +++ b/imageio/imageio-metadata/src/test/java/com/twelvemonkeys/imageio/metadata/jpeg/JPEGSegmentUtilTest.java @@ -151,19 +151,21 @@ public class JPEGSegmentUtilTest { @Test public void testReadAll() throws IOException { List segments = JPEGSegmentUtil.readSegments(getData("/jpeg/9788245605525.jpg"), JPEGSegmentUtil.ALL_SEGMENTS); - assertEquals(6, segments.size()); + assertEquals(7, segments.size()); assertEquals(segments.toString(), JPEG.SOF0, segments.get(3).marker()); assertEquals(segments.toString(), null, segments.get(3).identifier()); + assertEquals(segments.toString(), JPEG.SOS, segments.get(segments.size() - 1).marker()); } @Test public void testReadAllAlt() throws IOException { List segments = JPEGSegmentUtil.readSegments(getData("/jpeg/ts_open_300dpi.jpg"), JPEGSegmentUtil.ALL_SEGMENTS); - assertEquals(26, segments.size()); + assertEquals(27, segments.size()); assertEquals(segments.toString(), JPEG.SOF0, segments.get(23).marker()); assertEquals(segments.toString(), null, segments.get(23).identifier()); + assertEquals(segments.toString(), JPEG.SOS, segments.get(segments.size() - 1).marker()); } @Test