diff options
| author | 2011-09-21 16:40:23 +0800 | |
|---|---|---|
| committer | 2011-09-21 16:58:54 +0800 | |
| commit | 5f0ef5fb0c2e65ca3d0aa4fcd2b300d4cd0a2b4b (patch) | |
| tree | cc7f251a4d4daec94af93190e760d89566c8f36e | |
| parent | a2520fc13652126227e8b602af4566849c216f28 (diff) | |
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
| -rw-r--r-- | core/jni/android_hardware_Camera.cpp | 39 |
1 files changed, 14 insertions, 25 deletions
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 884fa78e308b..fe603813da27 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<IMemory>& dataPtr, int if (heapBase != NULL) { const jbyte* data = reinterpret_cast<const jbyte*>(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 (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 (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 (obj == NULL) { return; } } + } else { + LOGV("Allocating callback buffer"); + obj = env->NewByteArray(size); } if (obj == NULL) { |