Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1434cc06 authored by junjiez's avatar junjiez
Browse files

SnapdraongGallery:Get HEIC exif

add new method to get exif
from HEIC image.

Change-Id: I19fbec5c6ca5dd305283dddaec399ff7a4e06a17
CRs-Fixed: 2534943
parent c4ddefcf
Loading
Loading
Loading
Loading
+57 −25
Original line number Diff line number Diff line
@@ -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,10 +756,7 @@ 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");
        }

        if (dataStream.readShort() == JpegHeader.SOI) {
            short marker = dataStream.readShort();
            while (marker != JpegHeader.EOI
                    && !JpegHeader.isSofMarker(marker)) {
@@ -784,6 +784,38 @@ class ExifParser {
                }
                marker = dataStream.readShort();
            }


        } 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");
            }

        }

        return false;
    }

+2 −1
Original line number Diff line number Diff line
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -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;