diff options
author | Igor Murashkin <iam@google.com> | 2014-06-24 10:49:11 -0700 |
---|---|---|
committer | Igor Murashkin <iam@google.com> | 2014-06-24 18:29:18 +0000 |
commit | 5096defdaa4716ce81047a855d6e5ce3f8263600 (patch) | |
tree | 6fe4d2b0a19d1e5e54d3efb0a73af9b8805fe0cf /media/jni/android_media_ImageReader.cpp | |
parent | a296fece2b974a11bc624fd67b275863f17df867 (diff) | |
download | frameworks_base-5096defdaa4716ce81047a855d6e5ce3f8263600.zip frameworks_base-5096defdaa4716ce81047a855d6e5ce3f8263600.tar.gz frameworks_base-5096defdaa4716ce81047a855d6e5ce3f8263600.tar.bz2 |
camera2: (legacy) Write the JPEG size as part of the blob transport
This fixes StillCaptureTest#testStillPreviewCombination
Change-Id: Ifbaae7828b2efcc1a768c77ce50718abd7f691d0
Diffstat (limited to 'media/jni/android_media_ImageReader.cpp')
-rw-r--r-- | media/jni/android_media_ImageReader.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp index 41ed9e1..ad7ee7a 100644 --- a/media/jni/android_media_ImageReader.cpp +++ b/media/jni/android_media_ImageReader.cpp @@ -33,6 +33,9 @@ #include <jni.h> #include <JNIHelp.h> +#include <stdint.h> +#include <inttypes.h> + #define ALIGN(x, mask) ( ((x) + (mask) - 1) & ~((mask) - 1) ) #define ANDROID_MEDIA_IMAGEREADER_CTX_JNI_ID "mNativeContext" @@ -300,6 +303,14 @@ static uint32_t Image_getJpegSize(CpuConsumer::LockedBuffer* buffer) // failed to find size, default to whole buffer if (size == 0) { + /* + * This is a problem because not including the JPEG header + * means that in certain rare situations a regular JPEG blob + * will be misidentified as having a header, in which case + * we will get a garbage size value. + */ + ALOGW("%s: No JPEG header detected, defaulting to size=width=%d", + __FUNCTION__, width); size = width; } @@ -848,6 +859,14 @@ static jobject Image_getByteBuffer(JNIEnv* env, jobject thiz, int idx) // Create byteBuffer from native buffer Image_getLockedBufferInfo(env, buffer, idx, &base, &size); + + if (size > static_cast<uint32_t>(INT32_MAX)) { + // Byte buffer have 'int capacity', so check the range + jniThrowExceptionFmt(env, "java/lang/IllegalStateException", + "Size too large for bytebuffer capacity " PRIu32, size); + return NULL; + } + byteBuffer = env->NewDirectByteBuffer(base, size); // TODO: throw dvm exOutOfMemoryError? if ((byteBuffer == NULL) && (env->ExceptionCheck() == false)) { |