summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Luu <tluu@ti.com>2012-06-25 10:38:16 -0500
committerJason Simmons <jsimmons@google.com>2012-11-07 14:36:32 -0800
commitffc1968e8c1188095c0d8d6b5379abdc7a06c9bd (patch)
treefd5e086429298c29ca49cb1e26ed28d16a7b776b
parent1d40b78f3a968634194f0c1d878d1ba122f435d7 (diff)
downloadomap4-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.cpp63
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);
+ }
}
}