diff options
author | Mike Lockwood <lockwood@android.com> | 2011-04-24 18:40:17 -0700 |
---|---|---|
committer | Mike Lockwood <lockwood@android.com> | 2011-04-25 17:40:33 -0700 |
commit | c89f22242b955ae748765b3465b819b40f70ee5f (patch) | |
tree | e6eb68d7849ee6954b0b309b480b79ac93c1893f /media/jni | |
parent | 466e3a22db283958a1da71cc60a23ce3976a3659 (diff) | |
download | frameworks_base-c89f22242b955ae748765b3465b819b40f70ee5f.zip frameworks_base-c89f22242b955ae748765b3465b819b40f70ee5f.tar.gz frameworks_base-c89f22242b955ae748765b3465b819b40f70ee5f.tar.bz2 |
MTP: Implement GetThumb command
This allows the PC to access thumbnails in JPEG files over MTP/PTP
Bug: 3219495
Change-Id: I4964f8b4826dffb7f0f77464ec91bd2e97a2f007
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'media/jni')
-rw-r--r-- | media/jni/Android.mk | 4 | ||||
-rw-r--r-- | media/jni/android_mtp_MtpDatabase.cpp | 63 |
2 files changed, 66 insertions, 1 deletions
diff --git a/media/jni/Android.mk b/media/jni/Android.mk index 4fd4147..77cedd5 100644 --- a/media/jni/Android.mk +++ b/media/jni/Android.mk @@ -27,9 +27,11 @@ LOCAL_SHARED_LIBRARIES := \ libcamera_client \ libsqlite \ libmtp \ - libusbhost + libusbhost \ + libexif LOCAL_C_INCLUDES += \ + external/jhead \ external/tremor/Tremor \ frameworks/base/core/jni \ frameworks/base/media/libmedia \ diff --git a/media/jni/android_mtp_MtpDatabase.cpp b/media/jni/android_mtp_MtpDatabase.cpp index 585cd30..0f3c063 100644 --- a/media/jni/android_mtp_MtpDatabase.cpp +++ b/media/jni/android_mtp_MtpDatabase.cpp @@ -35,6 +35,10 @@ #include "MtpUtils.h" #include "mtp.h" +extern "C" { +#include "jhead.h" +} + using namespace android; // ---------------------------------------------------------------------------- @@ -141,6 +145,8 @@ public: virtual MtpResponseCode getObjectInfo(MtpObjectHandle handle, MtpObjectInfo& info); + virtual void* getThumbnail(MtpObjectHandle handle, size_t& outThumbSize); + virtual MtpResponseCode getObjectFilePath(MtpObjectHandle handle, MtpString& outFilePath, int64_t& outFileLength, @@ -776,10 +782,67 @@ MtpResponseCode MyMtpDatabase::getObjectInfo(MtpObjectHandle handle, info.mName = strdup((const char *)temp); env->ReleaseCharArrayElements(mStringBuffer, str, 0); + // read EXIF data for thumbnail information + if (info.mFormat == MTP_FORMAT_EXIF_JPEG || info.mFormat == MTP_FORMAT_JFIF) { + MtpString path; + int64_t length; + MtpObjectFormat format; + if (getObjectFilePath(handle, path, length, format) == MTP_RESPONSE_OK) { + 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; + info.mThumbFormat = MTP_FORMAT_EXIF_JPEG; + info.mImagePixWidth = ImageInfo.Width; + info.mImagePixHeight = ImageInfo.Height; + } + } + DiscardData(); + } + } + checkAndClearExceptionFromCallback(env, __FUNCTION__); return MTP_RESPONSE_OK; } +void* MyMtpDatabase::getThumbnail(MtpObjectHandle handle, size_t& outThumbSize) { + MtpString path; + int64_t length; + MtpObjectFormat format; + void* result = NULL; + outThumbSize = 0; + + 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(); + } + } + + return result; +} + MtpResponseCode MyMtpDatabase::getObjectFilePath(MtpObjectHandle handle, MtpString& outFilePath, int64_t& outFileLength, |