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
|
// "Adobe" APP14
|
||||||
|
|
||||||
// Possibly
|
// Possibly
|
||||||
// "http://ns.adobe.com/xap/1.0/" (XMP)
|
// "http://ns.adobe.com/xap/1.0/" (XMP) APP1
|
||||||
// "Photoshop 3.0" (Contains IPTC)
|
// "Photoshop 3.0" (may contain IPTC) APP13
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,8 @@ public final class JPEGSegmentUtil {
|
|||||||
|
|
||||||
JPEGSegment segment;
|
JPEGSegment segment;
|
||||||
try {
|
try {
|
||||||
while (!isImageDone(segment = readSegment(stream, segmentIdentifiers))) {
|
do {
|
||||||
|
segment = readSegment(stream, segmentIdentifiers);
|
||||||
// System.err.println("segment: " + segment);
|
// System.err.println("segment: " + segment);
|
||||||
|
|
||||||
if (isRequested(segment, segmentIdentifiers)) {
|
if (isRequested(segment, segmentIdentifiers)) {
|
||||||
@ -106,6 +107,7 @@ public final class JPEGSegmentUtil {
|
|||||||
segments.add(segment);
|
segments.add(segment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
while (!isImageDone(segment));
|
||||||
}
|
}
|
||||||
catch (EOFException ignore) {
|
catch (EOFException ignore) {
|
||||||
// Just end here, in case of malformed stream
|
// 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 {
|
static JPEGSegment readSegment(final ImageInputStream stream, Map<Integer, List<String>> segmentIdentifiers) throws IOException {
|
||||||
int marker = stream.readUnsignedShort();
|
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
|
int length = stream.readUnsignedShort(); // Length including length field itself
|
||||||
|
|
||||||
byte[] data;
|
byte[] data;
|
||||||
@ -192,7 +197,7 @@ public final class JPEGSegmentUtil {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean contains(Object o) {
|
public boolean contains(Object o) {
|
||||||
return true;
|
return o instanceof String;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,13 +209,13 @@ public final class JPEGSegmentUtil {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> get(Object key) {
|
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
|
@Override
|
||||||
public boolean containsKey(Object key) {
|
public boolean containsKey(Object key) {
|
||||||
return true;
|
return key instanceof Integer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,19 +151,21 @@ public class JPEGSegmentUtilTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testReadAll() throws IOException {
|
public void testReadAll() throws IOException {
|
||||||
List<JPEGSegment> segments = JPEGSegmentUtil.readSegments(getData("/jpeg/9788245605525.jpg"), JPEGSegmentUtil.ALL_SEGMENTS);
|
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(), JPEG.SOF0, segments.get(3).marker());
|
||||||
assertEquals(segments.toString(), null, segments.get(3).identifier());
|
assertEquals(segments.toString(), null, segments.get(3).identifier());
|
||||||
|
assertEquals(segments.toString(), JPEG.SOS, segments.get(segments.size() - 1).marker());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testReadAllAlt() throws IOException {
|
public void testReadAllAlt() throws IOException {
|
||||||
List<JPEGSegment> segments = JPEGSegmentUtil.readSegments(getData("/jpeg/ts_open_300dpi.jpg"), JPEGSegmentUtil.ALL_SEGMENTS);
|
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(), JPEG.SOF0, segments.get(23).marker());
|
||||||
assertEquals(segments.toString(), null, segments.get(23).identifier());
|
assertEquals(segments.toString(), null, segments.get(23).identifier());
|
||||||
|
assertEquals(segments.toString(), JPEG.SOS, segments.get(segments.size() - 1).marker());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Loading…
x
Reference in New Issue
Block a user