summaryrefslogtreecommitdiff
path: root/media/jni/android_media_ImageReader.cpp
diff options
context:
space:
mode:
authorRuben Brunk <rubenbrunk@google.com>2014-09-25 19:56:54 -0700
committerRuben Brunk <rubenbrunk@google.com>2014-09-26 18:00:21 -0700
commit31798f33184fd59dd3d3cc55e6373d9f91d220b6 (patch)
tree0a4f6eb3be24979e8f9fb440a8ecbb90c66694df /media/jni/android_media_ImageReader.cpp
parent2c3d7c5f68993531a4f5f91c1335cac8ca448e17 (diff)
camera2: Fix native ImageReader test segfaults.
Bug: 17675571 - Check for JPEG footer in correct location from ImageReader when using the RGBA override. - Add additional error checks in produceFrame method. - Avoid allocating extra space for jpeg buffers due to incorrect width calculations. Change-Id: I926f37e8b3e5c4bad24c16dcee48d52adb1706dd
Diffstat (limited to 'media/jni/android_media_ImageReader.cpp')
-rw-r--r--media/jni/android_media_ImageReader.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp
index a7347745bd86..f4eb4594e198 100644
--- a/media/jni/android_media_ImageReader.cpp
+++ b/media/jni/android_media_ImageReader.cpp
@@ -286,13 +286,17 @@ static int Image_getPixelFormat(JNIEnv* env, int format)
return format;
}
-static uint32_t Image_getJpegSize(CpuConsumer::LockedBuffer* buffer)
+static uint32_t Image_getJpegSize(CpuConsumer::LockedBuffer* buffer, bool usingRGBAOverride)
{
ALOG_ASSERT(buffer != NULL, "Input buffer is NULL!!!");
uint32_t size = 0;
uint32_t width = buffer->width;
uint8_t* jpegBuffer = buffer->data;
+ if (usingRGBAOverride) {
+ width *= 4;
+ }
+
// First check for JPEG transport header at the end of the buffer
uint8_t* header = jpegBuffer + (width - sizeof(struct camera3_jpeg_blob));
struct camera3_jpeg_blob *blob = (struct camera3_jpeg_blob*)(header);
@@ -317,11 +321,15 @@ static uint32_t Image_getJpegSize(CpuConsumer::LockedBuffer* buffer)
return size;
}
+static bool usingRGBAToJpegOverride(int32_t bufferFormat, int32_t readerCtxFormat) {
+ return readerCtxFormat == HAL_PIXEL_FORMAT_BLOB && bufferFormat == HAL_PIXEL_FORMAT_RGBA_8888;
+}
+
static int32_t applyFormatOverrides(int32_t bufferFormat, int32_t readerCtxFormat)
{
// Using HAL_PIXEL_FORMAT_RGBA_8888 gralloc buffers containing JPEGs to get around SW
// write limitations for some platforms (b/17379185).
- if (readerCtxFormat == HAL_PIXEL_FORMAT_BLOB && bufferFormat == HAL_PIXEL_FORMAT_RGBA_8888) {
+ if (usingRGBAToJpegOverride(bufferFormat, readerCtxFormat)) {
return HAL_PIXEL_FORMAT_BLOB;
}
return bufferFormat;
@@ -345,6 +353,7 @@ static void Image_getLockedBufferInfo(JNIEnv* env, CpuConsumer::LockedBuffer* bu
dataSize = ySize = cSize = cStride = 0;
int32_t fmt = buffer->format;
+ bool usingRGBAOverride = usingRGBAToJpegOverride(fmt, readerFormat);
fmt = applyFormatOverrides(fmt, readerFormat);
switch (fmt) {
case HAL_PIXEL_FORMAT_YCbCr_420_888:
@@ -416,7 +425,7 @@ static void Image_getLockedBufferInfo(JNIEnv* env, CpuConsumer::LockedBuffer* bu
ALOG_ASSERT(buffer->height == 1, "JPEG should has height value %d", buffer->height);
pData = buffer->data;
- dataSize = Image_getJpegSize(buffer);
+ dataSize = Image_getJpegSize(buffer, usingRGBAOverride);
break;
case HAL_PIXEL_FORMAT_RAW_SENSOR:
// Single plane 16bpp bayer data.
@@ -912,7 +921,7 @@ static jobject Image_getByteBuffer(JNIEnv* env, jobject thiz, int idx, int reade
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);
+ "Size too large for bytebuffer capacity %" PRIu32, size);
return NULL;
}