CameraHal: Add error handling during frame callbacks
- ST can be abandoned by the client, so we
need to handle this case inside 'handleFrameCallback'
without crashing.
- 'freeBufferList()' should only release buffers
associated with it.
Change-Id: Ib052aa6a6c2b5cb495d4e8bcc804cd3a3b87c95f
Signed-off-by: Emilian Peev <epeev@mm-sol.com>
Signed-off-by: Vladimir Petrov <vppetrov@mm-sol.com>
diff --git a/camera/BufferSourceAdapter.cpp b/camera/BufferSourceAdapter.cpp
index 7d05c24..67fb339 100644
--- a/camera/BufferSourceAdapter.cpp
+++ b/camera/BufferSourceAdapter.cpp
@@ -799,16 +799,14 @@
status_t ret = NO_ERROR;
+ if ( mBuffers != buflist ) {
+ return BAD_VALUE;
+ }
+
android::AutoMutex lock(mLock);
if (mBufferSourceDirection == BUFFER_SOURCE_TAP_OUT) returnBuffersToWindow();
- if ( NULL != buflist )
- {
- delete [] buflist;
- mBuffers = NULL;
- }
-
if( mBuffers != NULL)
{
delete [] mBuffers;
@@ -878,6 +876,7 @@
ret = mBufferSource->set_crop(mBufferSource, x, y, x + frame->mWidth, y + frame->mHeight);
if (NO_ERROR != ret) {
CAMHAL_LOGE("mBufferSource->set_crop returned error %d", ret);
+ goto fail;
}
if ( NULL != frame->mMetaData.get() ) {
@@ -888,6 +887,7 @@
ret = extendedOps()->set_metadata(mBufferSource, extMeta);
if (ret != 0) {
CAMHAL_LOGE("Surface::set_metadata returned error %d", ret);
+ goto fail;
}
}
}
@@ -898,9 +898,18 @@
ret = mBufferSource->enqueue_buffer(mBufferSource, handle);
if (ret != 0) {
CAMHAL_LOGE("Surface::queueBuffer returned error %d", ret);
+ goto fail;
}
mFramesWithCameraAdapterMap.removeItem((buffer_handle_t *) frame->mBuffer->opaque);
+
+ return;
+
+fail:
+ mFramesWithCameraAdapterMap.clear();
+ mBufferSource = NULL;
+ mReturnFrame->requestExit();
+ mQueueFrame->requestExit();
}