MediaExtractor: set buffer offset/limit in readSampleData
also fix setting offset/limit in MediaCodec's getBuffer.
Bug: 13008204
Change-Id: Iadf0f006cfccc2546971cc5384058e1a2721780b
diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp
index 3dbf77b..52e9910 100644
--- a/media/jni/android_media_MediaExtractor.cpp
+++ b/media/jni/android_media_MediaExtractor.cpp
@@ -36,6 +36,8 @@
#include <media/stagefright/MetaData.h>
#include <media/stagefright/NuMediaExtractor.h>
+#include <nativehelper/ScopedLocalRef.h>
+
#include "android_util_Binder.h"
namespace android {
@@ -206,12 +208,12 @@
size_t dstSize;
jbyteArray byteArray = NULL;
- if (dst == NULL) {
- jclass byteBufClass = env->FindClass("java/nio/ByteBuffer");
- CHECK(byteBufClass != NULL);
+ ScopedLocalRef<jclass> byteBufClass(env, env->FindClass("java/nio/ByteBuffer"));
+ CHECK(byteBufClass.get() != NULL);
+ if (dst == NULL) {
jmethodID arrayID =
- env->GetMethodID(byteBufClass, "array", "()[B");
+ env->GetMethodID(byteBufClass.get(), "array", "()[B");
CHECK(arrayID != NULL);
byteArray =
@@ -251,6 +253,24 @@
*sampleSize = buffer->size();
+ jmethodID positionID = env->GetMethodID(
+ byteBufClass.get(), "position", "(I)Ljava/nio/Buffer;");
+
+ CHECK(positionID != NULL);
+
+ jmethodID limitID = env->GetMethodID(
+ byteBufClass.get(), "limit", "(I)Ljava/nio/Buffer;");
+
+ CHECK(limitID != NULL);
+
+ jobject me = env->CallObjectMethod(
+ byteBuf, limitID, offset + *sampleSize);
+ env->DeleteLocalRef(me);
+ me = env->CallObjectMethod(
+ byteBuf, positionID, offset);
+ env->DeleteLocalRef(me);
+ me = NULL;
+
return OK;
}