summaryrefslogtreecommitdiff
path: root/media/jni/android_media_MediaExtractor.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-03-12 14:04:01 -0700
committerAndreas Huber <andih@google.com>2012-03-12 14:49:43 -0700
commitc52b980277f08aee7981b1fdbca7a89464cf66d9 (patch)
tree050be0842d6d87c56c10c6201b70262b81c4e024 /media/jni/android_media_MediaExtractor.cpp
parentc4ffe77a710880416a7cf7c20277311bab2d7abc (diff)
Documentation/API update for MediaCodec/MediaExtractor, fixes to MediaCodec.
and MediaExtractor.readSampleData now works with a non-direct byte buffer. Change-Id: Ifbe5c152d9550c34d3b1d493e12a223eb98e8b4e
Diffstat (limited to 'media/jni/android_media_MediaExtractor.cpp')
-rw-r--r--media/jni/android_media_MediaExtractor.cpp35
1 files changed, 31 insertions, 4 deletions
diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp
index 4757adfc6429..0c86fc2bf38c 100644
--- a/media/jni/android_media_MediaExtractor.cpp
+++ b/media/jni/android_media_MediaExtractor.cpp
@@ -101,14 +101,37 @@ status_t JMediaExtractor::readSampleData(
void *dst = env->GetDirectBufferAddress(byteBuf);
+ jlong dstSize;
+ jbyteArray byteArray = NULL;
+
if (dst == NULL) {
- // XXX if dst is NULL also fall back to "array()"
- return INVALID_OPERATION;
- }
+ jclass byteBufClass = env->FindClass("java/nio/ByteBuffer");
+ CHECK(byteBufClass != NULL);
+
+ jmethodID arrayID =
+ env->GetMethodID(byteBufClass, "array", "()[B");
+ CHECK(arrayID != NULL);
+
+ byteArray =
+ (jbyteArray)env->CallObjectMethod(byteBuf, arrayID);
+
+ if (byteArray == NULL) {
+ return INVALID_OPERATION;
+ }
- jlong dstSize = env->GetDirectBufferCapacity(byteBuf);
+ jboolean isCopy;
+ dst = env->GetByteArrayElements(byteArray, &isCopy);
+
+ dstSize = env->GetArrayLength(byteArray);
+ } else {
+ dstSize = env->GetDirectBufferCapacity(byteBuf);
+ }
if (dstSize < offset) {
+ if (byteArray != NULL) {
+ env->ReleaseByteArrayElements(byteArray, (jbyte *)dst, 0);
+ }
+
return -ERANGE;
}
@@ -116,6 +139,10 @@ status_t JMediaExtractor::readSampleData(
status_t err = mImpl->readSampleData(buffer);
+ if (byteArray != NULL) {
+ env->ReleaseByteArrayElements(byteArray, (jbyte *)dst, 0);
+ }
+
if (err != OK) {
return err;
}