Loading media/jni/Android.mk +2 −5 Original line number Diff line number Diff line Loading @@ -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 \ Loading media/jni/android_mtp_MtpDatabase.cpp +44 −32 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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]; Loading Loading @@ -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__); Loading @@ -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); } } Loading Loading
media/jni/Android.mk +2 −5 Original line number Diff line number Diff line Loading @@ -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 \ Loading
media/jni/android_mtp_MtpDatabase.cpp +44 −32 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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]; Loading Loading @@ -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__); Loading @@ -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); } } Loading