mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-08-03 11:35:29 -04:00
TMI-JPEG-22: Fixed issue with trash 0x00 padding in JPEG.
This commit is contained in:
parent
55a373b0ff
commit
ce87171026
@ -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);
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user