TMI-META: Now correctly reads/parses SOS marker segment. Slightly stricter checking of markers.

This commit is contained in:
Harald Kuhr 2013-02-06 10:44:49 +01:00
parent 41a08761ba
commit fcd15a9e36
3 changed files with 15 additions and 8 deletions

View File

@ -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
}

View File

@ -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<Integer, List<String>> 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<String> 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;
}
}

View File

@ -151,19 +151,21 @@ public class JPEGSegmentUtilTest {
@Test
public void testReadAll() throws IOException {
List<JPEGSegment> 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<JPEGSegment> 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