diff options
author | Tyler Luu <tluu@ti.com> | 2012-06-25 10:38:16 -0500 |
---|---|---|
committer | Jason Simmons <jsimmons@google.com> | 2012-11-07 14:36:32 -0800 |
commit | ffc1968e8c1188095c0d8d6b5379abdc7a06c9bd (patch) | |
tree | fd5e086429298c29ca49cb1e26ed28d16a7b776b | |
parent | 1d40b78f3a968634194f0c1d878d1ba122f435d7 (diff) | |
download | omap4-aah-ffc1968e8c1188095c0d8d6b5379abdc7a06c9bd.tar.gz |
CameraHal: Fix erroneous free of image buffers
- We were freeing image buffers erroneously when camera adapter
called freeImageBufs during the buffer size query call after
we already cleared mBufferSourceAdapter_Out. This caused
freeImageBufs to take an incorrect path.
- When trying to figure out number of tap out buffers to allocate,
use NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP as the default when
tap out hasn't been configured yet.
Change-Id: I045ef357578c7eafd12fef58ef50542a711c8233
Signed-off-by: Tyler Luu <tluu@ti.com>
Signed-off-by: Vladimir Petrov <vppetrov@mm-sol.com>
-rw-r--r-- | camera/CameraHal.cpp | 63 |
1 files changed, 37 insertions, 26 deletions
diff --git a/camera/CameraHal.cpp b/camera/CameraHal.cpp index 0f277e4..73bca33 100644 --- a/camera/CameraHal.cpp +++ b/camera/CameraHal.cpp @@ -1634,9 +1634,10 @@ status_t CameraHal::freeImageBufs() mBufferSourceAdapter_Out = 0; } else { ret = mMemoryManager->freeBufferList(mImageBuffers); - mImageBuffers = NULL; } + mImageBuffers = NULL; + LOG_FUNCTION_NAME_EXIT; return ret; @@ -3172,6 +3173,7 @@ status_t CameraHal::__takePicture(const char *params) unsigned int max_queueable = 0; unsigned int rawBufferCount = 1; bool isCPCamMode = false; + android::sp<DisplayAdapter> outAdapter = 0; #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS @@ -3269,19 +3271,7 @@ status_t CameraHal::__takePicture(const char *params) return BAD_VALUE; } CAMHAL_LOGD("Found matching out adapter at %d", index); - bool reset = (mOutAdapters.itemAt(index).get() != mBufferSourceAdapter_Out.get()); - mBufferSourceAdapter_Out = mOutAdapters.itemAt(index); - ret = mBufferSourceAdapter_Out->maxQueueableBuffers(max_queueable); - if (NO_ERROR != ret) { - CAMHAL_LOGE("Couldn't get max queuable"); - return ret; - } - mImageBuffers = mBufferSourceAdapter_Out->getBuffers(reset); - mImageOffsets = mBufferSourceAdapter_Out->getOffsets(); - mImageFd = mBufferSourceAdapter_Out->getFd(); - mImageLength = mBufferSourceAdapter_Out->getSize(); - } else { - mBufferSourceAdapter_Out.clear(); + outAdapter = mOutAdapters.itemAt(index); } mCameraAdapter->setParameters(mParameters); @@ -3321,8 +3311,11 @@ status_t CameraHal::__takePicture(const char *params) bufferCount = isCPCamMode || (burst > CameraHal::NO_BUFFERS_IMAGE_CAPTURE) ? CameraHal::NO_BUFFERS_IMAGE_CAPTURE : burst; - if (mBufferSourceAdapter_Out.get()) { - bufferCount = mBufferSourceAdapter_Out->getBufferCount(); + if (outAdapter.get()) { + bufferCount = outAdapter->getBufferCount(); + if (bufferCount < 1) { + bufferCount = NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP; + } } if ( NULL != mAppCallbackNotifier.get() ) { @@ -3379,16 +3372,34 @@ status_t CameraHal::__takePicture(const char *params) } } - // allocImageBufs will only allocate new buffers if mImageBuffers is NULL - if ( NO_ERROR == ret ) { - max_queueable = bufferCount; - ret = allocImageBufs(frame.mAlignment / getBPP(mParameters.getPictureFormat()), - frame.mHeight, - frame.mLength, - mParameters.getPictureFormat(), - bufferCount); - if ( NO_ERROR != ret ) { - CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret); + if (outAdapter.get()) { + bool reset; + // Need to reset buffers if we are switching adapters since we don't know + // the state of the new buffer list + reset = (outAdapter.get() != mBufferSourceAdapter_Out.get()); + ret = outAdapter->maxQueueableBuffers(max_queueable); + if (NO_ERROR != ret) { + CAMHAL_LOGE("Couldn't get max queuable"); + return ret; + } + mImageBuffers = outAdapter->getBuffers(reset); + mImageOffsets = outAdapter->getOffsets(); + mImageFd = outAdapter->getFd(); + mImageLength = outAdapter->getSize(); + mBufferSourceAdapter_Out = outAdapter; + } else { + mBufferSourceAdapter_Out.clear(); + // allocImageBufs will only allocate new buffers if mImageBuffers is NULL + if ( NO_ERROR == ret ) { + max_queueable = bufferCount; + ret = allocImageBufs(frame.mAlignment / getBPP(mParameters.getPictureFormat()), + frame.mHeight, + frame.mLength, + mParameters.getPictureFormat(), + bufferCount); + if ( NO_ERROR != ret ) { + CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret); + } } } |