diff options
author | Andreas Huber <andih@google.com> | 2012-03-12 14:04:01 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-03-12 14:49:43 -0700 |
commit | c52b980277f08aee7981b1fdbca7a89464cf66d9 (patch) | |
tree | 050be0842d6d87c56c10c6201b70262b81c4e024 /media/jni/android_media_MediaExtractor.cpp | |
parent | c4ffe77a710880416a7cf7c20277311bab2d7abc (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.cpp | 35 |
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; } |