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

Commit ece70967 authored by Marco Nelissen's avatar Marco Nelissen Committed by Android (Google) Code Review
Browse files

Merge "Make MtpDatabase use libexif instead of libjhead"

parents 559c1782 3cd393c5
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -37,17 +37,14 @@ LOCAL_SHARED_LIBRARIES := \
    libcamera_client \
    libmtp \
    libusbhost \
    libjhead \
    libexif \
    libstagefright_amrnb_common \

LOCAL_REQUIRED_MODULES := \
    libjhead_jni

LOCAL_STATIC_LIBRARIES := \
    libstagefright_amrnbenc

LOCAL_C_INCLUDES += \
    external/jhead \
    external/libexif/ \
    external/tremor/Tremor \
    frameworks/base/core/jni \
    frameworks/av/media/libmedia \
+44 −32
Original line number Diff line number Diff line
@@ -37,7 +37,10 @@
#include "mtp.h"

extern "C" {
#include "jhead.h"
#include "libexif/exif-content.h"
#include "libexif/exif-data.h"
#include "libexif/exif-tag.h"
#include "libexif/exif-utils.h"
}

using namespace android;
@@ -750,6 +753,22 @@ MtpResponseCode MyMtpDatabase::getObjectPropertyList(MtpObjectHandle handle,
    return result;
}

static void foreachentry(ExifEntry *entry, void *user) {
    char buf[1024];
    ALOGI("entry %x, format %d, size %d: %s",
            entry->tag, entry->format, entry->size, exif_entry_get_value(entry, buf, sizeof(buf)));
}

static void foreachcontent(ExifContent *content, void *user) {
    ALOGI("content %d", exif_content_get_ifd(content));
    exif_content_foreach_entry(content, foreachentry, user);
}

static long getLongFromExifEntry(ExifEntry *e) {
    ExifByteOrder o = exif_data_get_byte_order(e->parent->parent);
    return exif_get_long(e->data, o);
}

MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle,
                                            MtpObjectInfo& info) {
    char            date[20];
@@ -792,23 +811,22 @@ MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle,

    // read EXIF data for thumbnail information
    if (info.mFormat == MTP_FORMAT_EXIF_JPEG || info.mFormat == MTP_FORMAT_JFIF) {
        ResetJpgfile();
         // Start with an empty image information structure.
        memset(&ImageInfo, 0, sizeof(ImageInfo));
        ImageInfo.FlashUsed = -1;
        ImageInfo.MeteringMode = -1;
        ImageInfo.Whitebalance = -1;
        strncpy(ImageInfo.FileName, (const char *)path, PATH_MAX);
        if (ReadJpegFile((const char*)path, READ_METADATA)) {
            Section_t* section = FindSection(M_EXIF);
            if (section) {
                info.mThumbCompressedSize = ImageInfo.ThumbnailSize;

        ExifData *exifdata = exif_data_new_from_file(path);
        if (exifdata) {
            //exif_data_foreach_content(exifdata, foreachcontent, NULL);

            // XXX get this from exif, or parse jpeg header instead?
            ExifEntry *w = exif_content_get_entry(
                    exifdata->ifd[EXIF_IFD_EXIF], EXIF_TAG_PIXEL_X_DIMENSION);
            ExifEntry *h = exif_content_get_entry(
                    exifdata->ifd[EXIF_IFD_EXIF], EXIF_TAG_PIXEL_Y_DIMENSION);
            info.mThumbCompressedSize = exifdata->data ? exifdata->size : 0;
            info.mThumbFormat = MTP_FORMAT_EXIF_JPEG;
                info.mImagePixWidth = ImageInfo.Width;
                info.mImagePixHeight = ImageInfo.Height;
            }
            info.mImagePixWidth = getLongFromExifEntry(w);
            info.mImagePixHeight = getLongFromExifEntry(h);
            exif_data_unref(exifdata);
        }
        DiscardData();
    }

    checkAndClearExceptionFromCallback(env, __FUNCTION__);
@@ -824,22 +842,16 @@ void* MyMtpDatabase::getThumbnail(MtpObjectHandle handle, size_t& outThumbSize)

    if (getObjectFilePath(handle, path, length, format) == MTP_RESPONSE_OK
            && (format == MTP_FORMAT_EXIF_JPEG || format == MTP_FORMAT_JFIF)) {
        ResetJpgfile();
         // Start with an empty image information structure.
        memset(&ImageInfo, 0, sizeof(ImageInfo));
        ImageInfo.FlashUsed = -1;
        ImageInfo.MeteringMode = -1;
        ImageInfo.Whitebalance = -1;
        strncpy(ImageInfo.FileName, (const char *)path, PATH_MAX);
        if (ReadJpegFile((const char*)path, READ_METADATA)) {
            Section_t* section = FindSection(M_EXIF);
            if (section) {
                outThumbSize = ImageInfo.ThumbnailSize;
                result = malloc(outThumbSize);
                if (result)
                    memcpy(result, section->Data + ImageInfo.ThumbnailOffset + 8, outThumbSize);
            }
            DiscardData();

        ExifData *exifdata = exif_data_new_from_file(path);
        if (exifdata) {
            if (exifdata->data) {
                result = malloc(exifdata->size);
                if (result) {
                    memcpy(result, exifdata->data, exifdata->size);
                }
            }
            exif_data_unref(exifdata);
        }
    }