summaryrefslogtreecommitdiffstats
path: root/gallerycommon/src
diff options
context:
space:
mode:
authorEarl Ou <shunhsingou@google.com>2012-10-19 17:41:16 +0800
committerEarl Ou <shunhsingou@google.com>2012-10-31 14:49:04 +0800
commit3f120e267f39712f0ae3c08557aa713faf45c210 (patch)
tree7687237a3ad927cf6381d368ace920b99233be22 /gallerycommon/src
parentff0f96c07827c39df5a0b408a028e7198dc8294b (diff)
downloadandroid_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')
-rw-r--r--gallerycommon/src/com/android/gallery3d/exif/ExifParser.java33
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;
}
/**