summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-10-14 01:58:54 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-10-14 01:58:54 -0700
commitbeaa4f96cb9fee0fd32d531eb21966500f7ab7f4 (patch)
tree66b3857e8b90c7e8d135ef2abf7c584315ecf9b0
parent8ebe2c9946d8b741f61de6106198dd408c3afe2b (diff)
parent1434cc06e356b984f6a5dbf3e120a5413f669221 (diff)
downloadandroid_packages_apps_Gallery2-beaa4f96cb9fee0fd32d531eb21966500f7ab7f4.tar.gz
android_packages_apps_Gallery2-beaa4f96cb9fee0fd32d531eb21966500f7ab7f4.tar.bz2
android_packages_apps_Gallery2-beaa4f96cb9fee0fd32d531eb21966500f7ab7f4.zip
Merge "SnapdraongGallery:Get HEIC exif" into android-snapdragonGallery.lnx.2.0
-rwxr-xr-x[-rw-r--r--]gallerycommon/src/com/android/gallery3d/exif/ExifParser.java82
-rwxr-xr-xsrc/com/android/gallery3d/data/LocalImage.java3
-rwxr-xr-x[-rw-r--r--]src/com/android/gallery3d/data/MediaItem.java2
3 files changed, 61 insertions, 26 deletions
diff --git a/gallerycommon/src/com/android/gallery3d/exif/ExifParser.java b/gallerycommon/src/com/android/gallery3d/exif/ExifParser.java
index 5621c2339..ec653e9aa 100644..100755
--- a/gallerycommon/src/com/android/gallery3d/exif/ExifParser.java
+++ b/gallerycommon/src/com/android/gallery3d/exif/ExifParser.java
@@ -143,6 +143,9 @@ class ExifParser {
protected static final int DEFAULT_IFD0_OFFSET = 8;
+ //HEIC header
+ protected static final int HEIC_HEADER = 0x68656963;
+
private final CountedDataInputStream mTiffStream;
private final int mOptions;
private int mIfdStartOffset = 0;
@@ -753,37 +756,66 @@ class ExifParser {
private boolean seekTiffData(InputStream inputStream) throws IOException,
ExifInvalidFormatException {
CountedDataInputStream dataStream = new CountedDataInputStream(inputStream);
- if (dataStream.readShort() != JpegHeader.SOI) {
- throw new ExifInvalidFormatException("Invalid JPEG format");
- }
-
- short marker = dataStream.readShort();
- while (marker != JpegHeader.EOI
- && !JpegHeader.isSofMarker(marker)) {
- int length = dataStream.readUnsignedShort();
- // 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) {
- mTiffStartPosition = dataStream.getReadByteCount();
- mApp1End = length;
- mOffsetToApp1EndFromSOF = mTiffStartPosition + mApp1End;
- return true;
+ if (dataStream.readShort() == JpegHeader.SOI) {
+ short marker = dataStream.readShort();
+ while (marker != JpegHeader.EOI
+ && !JpegHeader.isSofMarker(marker)) {
+ int length = dataStream.readUnsignedShort();
+ // 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) {
+ mTiffStartPosition = dataStream.getReadByteCount();
+ mApp1End = length;
+ mOffsetToApp1EndFromSOF = mTiffStartPosition + mApp1End;
+ return true;
+ }
}
}
+ if (length < 2 || (length - 2) != dataStream.skip(length - 2)) {
+ Log.w(TAG, "Invalid JPEG format.");
+ return false;
+ }
+ marker = dataStream.readShort();
}
- if (length < 2 || (length - 2) != dataStream.skip(length - 2)) {
- Log.w(TAG, "Invalid JPEG format.");
+
+
+ } else{
+ dataStream.skip(6);
+ if (dataStream.readInt() == HEIC_HEADER) {
+ while(true){
+ try{
+ short marker = dataStream.readShort();
+ if (marker == JpegHeader.APP1) {
+ int header = 0;
+ short headerTail = 0;
+ int length = dataStream.readUnsignedShort();
+ header = dataStream.readInt();
+ headerTail = dataStream.readShort();
+ if (header == EXIF_HEADER && headerTail == EXIF_HEADER_TAIL) {
+ mTiffStartPosition = dataStream.getReadByteCount();
+ mApp1End = length;
+ mOffsetToApp1EndFromSOF = mTiffStartPosition + mApp1End;
+ return true;
+ }
+ }
+ }catch (Exception e){
+ break;
+ }
+ }
return false;
+ } else {
+ throw new ExifInvalidFormatException("Invalid JPEG format");
}
- marker = dataStream.readShort();
+
}
+
return false;
}
diff --git a/src/com/android/gallery3d/data/LocalImage.java b/src/com/android/gallery3d/data/LocalImage.java
index 2743a3e32..1b5c88b26 100755
--- a/src/com/android/gallery3d/data/LocalImage.java
+++ b/src/com/android/gallery3d/data/LocalImage.java
@@ -356,7 +356,8 @@ public class LocalImage extends LocalMediaItem {
public MediaDetails getDetails() {
MediaDetails details = super.getDetails();
details.addDetail(MediaDetails.INDEX_ORIENTATION, Integer.valueOf(rotation));
- if (MIME_TYPE_JPEG.equals(mimeType)) {
+ if (MIME_TYPE_JPEG.equals(mimeType) || MIME_TYPE_HEIF.equals(mimeType) ||
+ MIME_TYPE_HEIC.equals(mimeType)) {
// ExifInterface returns incorrect values for photos in other format.
// For example, the width and height of an webp images is always '0'.
MediaDetails.extractExifInfo(details, filePath);
diff --git a/src/com/android/gallery3d/data/MediaItem.java b/src/com/android/gallery3d/data/MediaItem.java
index c27667c7b..da5813613 100644..100755
--- a/src/com/android/gallery3d/data/MediaItem.java
+++ b/src/com/android/gallery3d/data/MediaItem.java
@@ -37,6 +37,8 @@ public abstract class MediaItem extends MediaObject {
public static final int IMAGE_ERROR = -1;
public static final String MIME_TYPE_JPEG = "image/jpeg";
+ public static final String MIME_TYPE_HEIF = "image/heif";
+ public static final String MIME_TYPE_HEIC = "image/heic";
public static final String MIME_TYPE_GIF = "image/gif";
private static final int BYTESBUFFE_POOL_SIZE = 4;