diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java index 99a1bf3c..420bd1b4 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImage10MetadataCleaner.java @@ -233,6 +233,26 @@ final class JPEGImage10MetadataCleaner { markerSequence.insertBefore(unknown, next); } + // Known issues in the com.sun classes, if sof/sos component id or selector is negative, + // setFromTree will fail. We'll fix the range from -128...127 to be 0...255. + NodeList sofs = markerSequence.getElementsByTagName("sof"); + + if (sofs.getLength() > 0) { + NodeList components = sofs.item(0).getChildNodes(); + for (int i = 0; i < components.getLength(); i++) { + forceComponentIdInRange((IIOMetadataNode) components.item(i), "componentId"); + } + } + + NodeList sos = markerSequence.getElementsByTagName("sos"); + + for (int i = 0; i < sos.getLength(); i++) { + NodeList specs = sos.item(i).getChildNodes(); + for (int j = 0; j < specs.getLength(); j++) { + forceComponentIdInRange((IIOMetadataNode) specs.item(j), "componentSelector"); + } + } + // Inconsistency issue in the com.sun classes, it can read metadata with dht containing // more than 4 children, but will not allow setting such a tree... // We'll split AC/DC tables into separate dht nodes. @@ -277,4 +297,29 @@ final class JPEGImage10MetadataCleaner { return imageMetadata; } + + private void forceComponentIdInRange(final IIOMetadataNode component, final String attributeName) { + String attribute = component.getAttribute(attributeName); + + if (attribute != null) { + try { + int componentId = Integer.parseInt(attribute); + + if (componentId < 0) { + // Metadata doesn't like negative component ids/specs + // We'll convert to the positive value it probably should have been + componentId = ((byte) componentId) & 0xff; + component.setAttribute(attributeName, String.valueOf(componentId)); + } + } + catch (NumberFormatException ignore) { + if ("scanComponentSpec".equals(component.getNodeName())) { + reader.processWarningOccurred("Bad SOS component selector: " + attribute); + } + else { + reader.processWarningOccurred("Bad SOF component id: " + attribute); + } + } + } + } } diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java index 21adc6cf..e4a6e2b7 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java @@ -1349,8 +1349,9 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase