mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2025-08-03 11:35:29 -04:00
TMI-107: JPEGSegmentImageInputStream now recovers from EOFException while parsing segments.
This commit is contained in:
parent
34efe84e5a
commit
2b2dd2fb40
@ -74,7 +74,9 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
|
|||||||
|
|
||||||
if (streamPos >= segment.end()) {
|
if (streamPos >= segment.end()) {
|
||||||
// Go forward in cache
|
// Go forward in cache
|
||||||
while (++currentSegment < segments.size()) {
|
int cachedSegment = currentSegment;
|
||||||
|
while (++cachedSegment < segments.size()) {
|
||||||
|
currentSegment = cachedSegment;
|
||||||
segment = segments.get(currentSegment);
|
segment = segments.get(currentSegment);
|
||||||
|
|
||||||
if (streamPos >= segment.start && streamPos < segment.end()) {
|
if (streamPos >= segment.start && streamPos < segment.end()) {
|
||||||
@ -157,7 +159,9 @@ final class JPEGSegmentImageInputStream extends ImageInputStreamImpl {
|
|||||||
}
|
}
|
||||||
else if (streamPos < segment.start) {
|
else if (streamPos < segment.start) {
|
||||||
// Go back in cache
|
// Go back in cache
|
||||||
while (--currentSegment >= 0) {
|
int cachedSegment = currentSegment;
|
||||||
|
while (--cachedSegment >= 0) {
|
||||||
|
currentSegment = cachedSegment;
|
||||||
segment = segments.get(currentSegment);
|
segment = segments.get(currentSegment);
|
||||||
|
|
||||||
if (streamPos >= segment.start && streamPos < segment.end()) {
|
if (streamPos >= segment.start && streamPos < segment.end()) {
|
||||||
|
@ -417,19 +417,52 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
|
|||||||
@Ignore("Known issue in com.sun...JPEGMetadata")
|
@Ignore("Known issue in com.sun...JPEGMetadata")
|
||||||
@Test
|
@Test
|
||||||
public void testExifStandardMetadataColorSpaceTypeYCbCr() {
|
public void testExifStandardMetadataColorSpaceTypeYCbCr() {
|
||||||
// These reports RGB (by Exif non-presence?), while the data is really YCbCr
|
// These reports RGB in standard metadata, while the data is really YCbCr
|
||||||
fail("/jpeg/exif-jpeg-thumbnail-sony-dsc-p150-inverted-colors.jpg");
|
fail("/jpeg/exif-jpeg-thumbnail-sony-dsc-p150-inverted-colors.jpg");
|
||||||
fail("/jpeg/exif-pspro-13-inverted-colors.jpg");
|
fail("/jpeg/exif-pspro-13-inverted-colors.jpg");
|
||||||
fail("/jpeg/no-jfif-ycbcr.jpg");
|
fail("/jpeg/no-jfif-ycbcr.jpg");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBrokenReadRasterAfterGetMetadataException() throws IOException {
|
||||||
|
// See issue 107, from PDFBox team
|
||||||
|
JPEGImageReader reader = createReader();
|
||||||
|
|
||||||
|
try {
|
||||||
|
for (TestData broken : getBrokenTestData()) {
|
||||||
|
reader.setInput(broken.getInputStream());
|
||||||
|
|
||||||
|
try {
|
||||||
|
reader.getImageMetadata(0);
|
||||||
|
}
|
||||||
|
catch (IOException ignore) {
|
||||||
|
// Expected IOException here, due to broken file
|
||||||
|
// ignore.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
reader.readRaster(0, null);
|
||||||
|
}
|
||||||
|
catch (IOException expected) {
|
||||||
|
// Should not throw anything other than IOException here
|
||||||
|
if (!(expected instanceof EOFException)) {
|
||||||
|
assertNotNull(expected.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
reader.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBrokenRead() throws IOException {
|
public void testBrokenRead() throws IOException {
|
||||||
JPEGImageReader reader = createReader();
|
JPEGImageReader reader = createReader();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for (TestData broken : getBrokenTestData()) {
|
for (TestData broken : getBrokenTestData()) {
|
||||||
reader.setInput(ImageIO.createImageInputStream(broken.getInput()));
|
reader.setInput(broken.getInputStream());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
reader.read(0);
|
reader.read(0);
|
||||||
@ -455,7 +488,7 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
for (TestData broken : getBrokenTestData()) {
|
for (TestData broken : getBrokenTestData()) {
|
||||||
reader.setInput(ImageIO.createImageInputStream(broken.getInput()));
|
reader.setInput(broken.getInputStream());
|
||||||
|
|
||||||
Dimension exptectedSize = broken.getDimension(0);
|
Dimension exptectedSize = broken.getDimension(0);
|
||||||
|
|
||||||
@ -484,7 +517,7 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase<JPEGImageRe
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
for (TestData broken : getBrokenTestData()) {
|
for (TestData broken : getBrokenTestData()) {
|
||||||
reader.setInput(ImageIO.createImageInputStream(broken.getInput()));
|
reader.setInput(broken.getInputStream());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
reader.getImageMetadata(0);
|
reader.getImageMetadata(0);
|
||||||
|
@ -56,6 +56,7 @@ import static org.junit.Assert.*;
|
|||||||
public class JPEGSegmentImageInputStreamTest {
|
public class JPEGSegmentImageInputStreamTest {
|
||||||
static {
|
static {
|
||||||
IIORegistry.getDefaultInstance().registerServiceProvider(new URLImageInputStreamSpi());
|
IIORegistry.getDefaultInstance().registerServiceProvider(new URLImageInputStreamSpi());
|
||||||
|
ImageIO.setUseCache(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected URL getClassLoaderResource(final String pName) {
|
protected URL getClassLoaderResource(final String pName) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user