diff options
author | junjiez <junjiez@codeaurora.org> | 2019-10-09 16:22:48 +0800 |
---|---|---|
committer | junjiez <junjiez@codeaurora.org> | 2019-10-09 16:22:48 +0800 |
commit | 1434cc06e356b984f6a5dbf3e120a5413f669221 (patch) | |
tree | e8e36091549aafcdf0fd002f32da5572f9a5921d | |
parent | c4ddefcfd1268445e003213159ade66485d36ca4 (diff) | |
download | android_packages_apps_Gallery2-1434cc06e356b984f6a5dbf3e120a5413f669221.tar.gz android_packages_apps_Gallery2-1434cc06e356b984f6a5dbf3e120a5413f669221.tar.bz2 android_packages_apps_Gallery2-1434cc06e356b984f6a5dbf3e120a5413f669221.zip |
SnapdraongGallery:Get HEIC exif
add new method to get exif
from HEIC image.
Change-Id: I19fbec5c6ca5dd305283dddaec399ff7a4e06a17
CRs-Fixed: 2534943
-rwxr-xr-x[-rw-r--r--] | gallerycommon/src/com/android/gallery3d/exif/ExifParser.java | 82 | ||||
-rwxr-xr-x | src/com/android/gallery3d/data/LocalImage.java | 3 | ||||
-rwxr-xr-x[-rw-r--r--] | src/com/android/gallery3d/data/MediaItem.java | 2 |
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; |