diff options
author | Earl Ou <shunhsingou@google.com> | 2012-10-19 17:41:16 +0800 |
---|---|---|
committer | Earl Ou <shunhsingou@google.com> | 2012-10-31 14:49:04 +0800 |
commit | 3f120e267f39712f0ae3c08557aa713faf45c210 (patch) | |
tree | 7687237a3ad927cf6381d368ace920b99233be22 /gallerycommon/src/com/android | |
parent | ff0f96c07827c39df5a0b408a028e7198dc8294b (diff) | |
download | android_packages_apps_Snap-3f120e267f39712f0ae3c08557aa713faf45c210.tar.gz android_packages_apps_Snap-3f120e267f39712f0ae3c08557aa713faf45c210.tar.bz2 android_packages_apps_Snap-3f120e267f39712f0ae3c08557aa713faf45c210.zip |
Handle images with multile APP1 in ExifParser
Change-Id: If88384066b008bc6a68976b6e291cc1dbcd65914
Diffstat (limited to 'gallerycommon/src/com/android')
-rw-r--r-- | gallerycommon/src/com/android/gallery3d/exif/ExifParser.java | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/gallerycommon/src/com/android/gallery3d/exif/ExifParser.java b/gallerycommon/src/com/android/gallery3d/exif/ExifParser.java index 2f5c5438d..91fed9c76 100644 --- a/gallerycommon/src/com/android/gallery3d/exif/ExifParser.java +++ b/gallerycommon/src/com/android/gallery3d/exif/ExifParser.java @@ -19,7 +19,6 @@ package com.android.gallery3d.exif; import android.util.Log; import java.io.DataInputStream; -import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.nio.ByteOrder; @@ -626,29 +625,35 @@ public class ExifParser { ExifInvalidFormatException { DataInputStream dataStream = new DataInputStream(inputStream); - // SOI and APP1 if (dataStream.readShort() != JpegHeader.SOI) { throw new ExifInvalidFormatException("Invalid JPEG format"); } short marker = dataStream.readShort(); - while(marker != JpegHeader.APP1 && marker != JpegHeader.EOI + while(marker != JpegHeader.EOI && !JpegHeader.isSofMarker(marker)) { int length = dataStream.readUnsignedShort(); - if ((length - 2) != dataStream.skip(length - 2)) { - throw new EOFException(); + // Some invalid formatted image contains multiple APP1, + // try to find the one with Exif data. + if (marker == JpegHeader.APP1) { + int header = 0; + short headerTail = 0; + if (length >= 8) { + header = dataStream.readInt(); + headerTail = dataStream.readShort(); + length -= 6; + if (header == EXIF_HEADER && headerTail == EXIF_HEADER_TAIL) { + return true; + } + } + } + if (length < 2 || (length - 2) != dataStream.skip(length - 2)) { + Log.w(TAG, "Invalid JPEG format."); + return false; } marker = dataStream.readShort(); } - - if (marker != JpegHeader.APP1) return false; // No APP1 segment - - // APP1 length, it's not used for us - dataStream.readShort(); - - // Exif header - return (dataStream.readInt() == EXIF_HEADER - && dataStream.readShort() == EXIF_HEADER_TAIL); + return false; } /** |