mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-08-02 11:05:29 -04:00
TMI-META: Now correctly reads/parses SOS marker segment. Slightly stricter checking of markers.
This commit is contained in:
parent
41a08761ba
commit
fcd15a9e36
@ -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
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user