OSDN Git Service

Switch to a type-safe album art interface.
authorElliott Hughes <enh@google.com>
Tue, 10 Jun 2014 23:53:31 +0000 (16:53 -0700)
committerElliott Hughes <enh@google.com>
Wed, 11 Jun 2014 21:43:57 +0000 (14:43 -0700)
(Requires a matching change in frameworks/av.)

Bug: 15514223
Change-Id: I4e494cc5d7a2eb82cd2b7ae3b829fc663136267a

media/jni/android_media_MediaMetadataRetriever.cpp
media/jni/android_media_MediaScanner.cpp

index c2694f1..0e34789 100644 (file)
@@ -23,6 +23,7 @@
 #include <utils/threads.h>
 #include <core/SkBitmap.h>
 #include <media/mediametadataretriever.h>
+#include <media/mediascanner.h>
 #include <private/media/VideoFrame.h>
 
 #include "jni.h"
@@ -326,17 +327,13 @@ static jbyteArray android_media_MediaMetadataRetriever_getEmbeddedPicture(
         return NULL;
     }
 
-    unsigned int len = mediaAlbumArt->mSize;
-    char* data = (char*) mediaAlbumArt + sizeof(MediaAlbumArt);
-    jbyteArray array = env->NewByteArray(len);
+    jbyteArray array = env->NewByteArray(mediaAlbumArt->size());
     if (!array) {  // OutOfMemoryError exception has already been thrown.
         ALOGE("getEmbeddedPicture: OutOfMemoryError is thrown.");
     } else {
-        jbyte* bytes = env->GetByteArrayElements(array, NULL);
-        if (bytes != NULL) {
-            memcpy(bytes, data, len);
-            env->ReleaseByteArrayElements(array, bytes, 0);
-        }
+        const jbyte* data =
+                reinterpret_cast<const jbyte*>(mediaAlbumArt->data());
+        env->SetByteArrayRegion(array, 0, mediaAlbumArt->size(), data);
     }
 
     // No need to delete mediaAlbumArt here
index b520440..321c2e3 100644 (file)
@@ -348,17 +348,16 @@ android_media_MediaScanner_extractAlbumArt(
     }
 
     int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
-    MediaAlbumArt* mediaAlbumArt =
-            reinterpret_cast<MediaAlbumArt*>(mp->extractAlbumArt(fd));
+    MediaAlbumArt* mediaAlbumArt = mp->extractAlbumArt(fd);
     if (mediaAlbumArt == NULL) {
         return NULL;
     }
 
-    jbyteArray array = env->NewByteArray(mediaAlbumArt->mSize);
+    jbyteArray array = env->NewByteArray(mediaAlbumArt->size());
     if (array != NULL) {
-        jbyte* bytes = env->GetByteArrayElements(array, NULL);
-        memcpy(bytes, &mediaAlbumArt->mData[0], mediaAlbumArt->mSize);
-        env->ReleaseByteArrayElements(array, bytes, 0);
+        const jbyte* data =
+                reinterpret_cast<const jbyte*>(mediaAlbumArt->data());
+        env->SetByteArrayRegion(array, 0, mediaAlbumArt->size(), data);
     }
 
 done: