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
This commit is contained in:
Wu-cheng Li
2011-09-21 16:40:23 +08:00
parent a2520fc136
commit 5f0ef5fb0c

View File

@@ -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 (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) {