From 1434cc06e356b984f6a5dbf3e120a5413f669221 Mon Sep 17 00:00:00 2001 From: junjiez Date: Wed, 9 Oct 2019 16:22:48 +0800 Subject: SnapdraongGallery:Get HEIC exif add new method to get exif from HEIC image. Change-Id: I19fbec5c6ca5dd305283dddaec399ff7a4e06a17 CRs-Fixed: 2534943 --- .../src/com/android/gallery3d/exif/ExifParser.java | 82 +++++++++++++++------- src/com/android/gallery3d/data/LocalImage.java | 3 +- src/com/android/gallery3d/data/MediaItem.java | 2 + 3 files changed, 61 insertions(+), 26 deletions(-) mode change 100644 => 100755 gallerycommon/src/com/android/gallery3d/exif/ExifParser.java mode change 100644 => 100755 src/com/android/gallery3d/data/MediaItem.java diff --git a/gallerycommon/src/com/android/gallery3d/exif/ExifParser.java b/gallerycommon/src/com/android/gallery3d/exif/ExifParser.java old mode 100644 new mode 100755 index 5621c2339..ec653e9aa --- 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 old mode 100644 new mode 100755 index c27667c7b..da5813613 --- 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; -- cgit v1.2.3