From 5f0ef5fb0c2e65ca3d0aa4fcd2b300d4cd0a2b4b Mon Sep 17 00:00:00 2001 From: Wu-cheng Li Date: Wed, 21 Sep 2011 16:40:23 +0800 Subject: [PATCH] Fix jpeg callback is lost if setPreviewCallbackWithBuffer has been called. mManualBufferMode is only for CAMERA_MSG_PREVIEW_FRAME. If it is CAMERA_MSG_COMPRESSED_IMAGE, a new byte array should be allocated. bug:5340480 Change-Id: I4f33bd6297bfd30505e0e15ae46012ea44e85962 --- core/jni/android_hardware_Camera.cpp | 35 ++++++++++------------------ 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 884fa78e308b3..fe603813da278 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -234,34 +234,23 @@ void JNICameraContext::copyAndPost(JNIEnv* env, const sp& dataPtr, int if (heapBase != NULL) { const jbyte* data = reinterpret_cast(heapBase + offset); - if (!mManualBufferMode) { - LOGV("Allocating callback buffer"); - obj = env->NewByteArray(size); - } else { - switch (msgType) { - case CAMERA_MSG_PREVIEW_FRAME: { - obj = getCallbackBuffer(env, &mCallbackBuffers, size); + if (msgType == CAMERA_MSG_RAW_IMAGE) { + obj = getCallbackBuffer(env, &mRawImageCallbackBuffers, size); + } else if (msgType == CAMERA_MSG_PREVIEW_FRAME && mManualBufferMode) { + obj = getCallbackBuffer(env, &mCallbackBuffers, size); - if (mCallbackBuffers.isEmpty()) { - LOGV("Out of buffers, clearing callback!"); - mCamera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_NOOP); - mManualCameraCallbackSet = false; + if (mCallbackBuffers.isEmpty()) { + LOGV("Out of buffers, clearing callback!"); + mCamera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_NOOP); + mManualCameraCallbackSet = false; - if (obj == NULL) { - return; - } - } - break; - } - case CAMERA_MSG_RAW_IMAGE: { - obj = getCallbackBuffer(env, &mRawImageCallbackBuffers, size); - break; - } - default: { - jniThrowRuntimeException(env, "Unsupported message type"); + if (obj == NULL) { return; } } + } else { + LOGV("Allocating callback buffer"); + obj = env->NewByteArray(size); } if (obj == NULL) {