TMI-JPEG-22: Fixed issue with trash 0x00 padding in JPEG.

This commit is contained in:
Harald Kuhr 2013-12-16 18:08:39 +01:00
parent 55a373b0ff
commit ce87171026
2 changed files with 30 additions and 2 deletions

View File

@ -91,6 +91,18 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
long realPosition = stream.getStreamPosition(); long realPosition = stream.getStreamPosition();
int marker = stream.readUnsignedShort(); int marker = stream.readUnsignedShort();
// Skip over weird 0x00 padding, but leave in stream, read seems to handle it well with a warning
int trash = 0;
while (marker == 0) {
marker = stream.readUnsignedShort();
trash += 2;
}
if (marker == 0x00ff) {
trash++;
marker = 0xff00 | stream.readUnsignedByte();
}
// Skip over 0xff padding between markers // Skip over 0xff padding between markers
while (marker == 0xffff) { while (marker == 0xffff) {
realPosition++; realPosition++;
@ -101,7 +113,7 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
// TODO: Refactor to make various segments optional, we probably only want the "Adobe" APP14 segment, 'Exif' APP1 and very few others // TODO: Refactor to make various segments optional, we probably only want the "Adobe" APP14 segment, 'Exif' APP1 and very few others
if (isAppSegmentMarker(marker) && !(marker == JPEG.APP1 && isAppSegmentWithId("Exif", stream)) && marker != JPEG.APP14) { if (isAppSegmentMarker(marker) && !(marker == JPEG.APP1 && isAppSegmentWithId("Exif", stream)) && marker != JPEG.APP14) {
int length = stream.readUnsignedShort(); // Length including length field itself int length = stream.readUnsignedShort(); // Length including length field itself
stream.seek(realPosition + 2 + length); // Skip marker (2) + length stream.seek(realPosition + trash + 2 + length); // Skip marker (2) + length
} }
else { else {
if (marker == JPEG.EOI) { if (marker == JPEG.EOI) {
@ -117,7 +129,7 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
} }
else { else {
// Length including length field itself // Length including length field itself
length = stream.readUnsignedShort() + 2; length = trash + stream.readUnsignedShort() + 2;
} }
segment = new Segment(marker, realPosition, segment.end(), length); segment = new Segment(marker, realPosition, segment.end(), length);

View File

@ -157,6 +157,22 @@ public final class JPEGSegmentUtil {
static JPEGSegment readSegment(final ImageInputStream stream, final Map<Integer, List<String>> segmentIdentifiers) throws IOException { static JPEGSegment readSegment(final ImageInputStream stream, final Map<Integer, List<String>> segmentIdentifiers) throws IOException {
int marker = stream.readUnsignedShort(); int marker = stream.readUnsignedShort();
// Skip over weird 0x00 padding...?
int bad = 0;
while (marker == 0) {
marker = stream.readUnsignedShort();
bad += 2;
}
if (marker == 0x00ff) {
bad++;
marker = 0xff00 | stream.readUnsignedByte();
}
if (bad != 0) {
// System.err.println("bad: " + bad);
}
// Skip over 0xff padding between markers // Skip over 0xff padding between markers
while (marker == 0xffff) { while (marker == 0xffff) {
marker = 0xff00 | stream.readUnsignedByte(); marker = 0xff00 | stream.readUnsignedByte();