#584 Fix "No SOF segment in stream" for JPEG in TIFF

+ interoperability testing for JEP-262, JAI and JDK readers.
This commit is contained in:
Harald Kuhr
2021-03-30 16:26:48 +02:00
parent 42196e8513
commit 5b7fc25520
18 changed files with 483 additions and 5 deletions
@@ -636,6 +636,12 @@ public final class JPEGImageReader extends ImageReaderBase {
try {
if (imageInput != null) {
// Need to wrap stream to avoid messing with the byte order of the underlying stream
// in the case we are operating as a delegate for ie. TIFFImageReader.
if (!(imageInput instanceof SubImageInputStream)) {
imageInput = new SubImageInputStream(imageInput, Long.MAX_VALUE);
}
streamOffsets.add(imageInput.getStreamPosition());
}
@@ -650,7 +656,7 @@ public final class JPEGImageReader extends ImageReaderBase {
private void initDelegate(boolean seekForwardOnly, boolean ignoreMetadata) throws IOException {
// JPEGSegmentImageInputStream that filters out/skips bad/unnecessary segments
delegate.setInput(imageInput != null
? new JPEGSegmentImageInputStream(new SubImageInputStream(imageInput, Long.MAX_VALUE), new JPEGSegmentWarningDelegate())
? new JPEGSegmentImageInputStream(imageInput, new JPEGSegmentWarningDelegate())
: null, seekForwardOnly, ignoreMetadata);
}
@@ -705,7 +711,6 @@ public final class JPEGImageReader extends ImageReaderBase {
thumbnails = null;
initDelegate(seekForwardOnly, ignoreMetadata);
initHeader();
}
@@ -67,7 +67,6 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
private int currentSegment = -1;
private Segment segment;
JPEGSegmentImageInputStream(final ImageInputStream stream, final JPEGSegmentWarningListener warningListener) {
this.stream = notNull(stream, "stream");
this.warningListener = notNull(warningListener, "warningListener");
@@ -333,7 +332,7 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
}
private void streamInit() throws IOException {
stream.seek(0);
long position = stream.getStreamPosition();
try {
int soi = stream.readUnsignedShort();
@@ -342,7 +341,7 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
throw new IIOException(String.format("Not a JPEG stream (starts with: 0x%04x, expected SOI: 0x%04x)", soi, JPEG.SOI));
}
segment = new Segment(soi, 0, 0, 2);
segment = new Segment(soi, position, 0, 2);
segments.add(segment);
currentSegment = segments.size() - 1; // 0