diff options
| author | 2012-12-19 15:40:47 -0800 | |
|---|---|---|
| committer | 2012-12-19 15:40:47 -0800 | |
| commit | eca3eb5983fb8e8cea17175869f86cda7613dd60 (patch) | |
| tree | de6569d0288dc5c2f3efc2edc65487ea8920882b | |
| parent | 6465b03fff97f9982b38d80e56b224acfebd39bb (diff) | |
| parent | cbbea8e651feb580f439e28359d72589709fb120 (diff) | |
Merge "Don't create weird ByteBuffers"
| -rw-r--r-- | media/jni/android_media_MediaCodec.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index 8740c0854d63..f8c945b1b5c3 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -237,15 +237,27 @@ status_t JMediaCodec::getBuffers( *bufArray = (jobjectArray)env->NewObjectArray( buffers.size(), byteBufferClass, NULL); + if (*bufArray == NULL) { + env->DeleteLocalRef(nativeByteOrderObj); + return NO_MEMORY; + } for (size_t i = 0; i < buffers.size(); ++i) { const sp<ABuffer> &buffer = buffers.itemAt(i); + // if this is an ABuffer that doesn't actually hold any accessible memory, + // use a null ByteBuffer + if (buffer->base() == NULL) { + continue; + } jobject byteBuffer = env->NewDirectByteBuffer( buffer->base(), buffer->capacity()); - + if (byteBuffer == NULL) { + env->DeleteLocalRef(nativeByteOrderObj); + return NO_MEMORY; + } jobject me = env->CallObjectMethod( byteBuffer, orderID, nativeByteOrderObj); env->DeleteLocalRef(me); @@ -715,7 +727,10 @@ static jobjectArray android_media_MediaCodec_getBuffers( return buffers; } - throwExceptionAsNecessary(env, err); + // if we're out of memory, an exception was already thrown + if (err != NO_MEMORY) { + throwExceptionAsNecessary(env, err); + } return NULL; } |