summaryrefslogtreecommitdiffstats
path: root/camera/ANativeWindowDisplayAdapter.cpp
diff options
context:
space:
mode:
authorAkwasi Boateng <akwasi.boateng@ti.com>2011-09-15 19:50:02 -0500
committerIliyan Malchev <malchev@google.com>2011-09-21 16:10:54 -0700
commit8e88af31129b8cc09675279ca2eac88256d8526b (patch)
tree16105c32ab4a06fe22e31a88951b7e113ea3668e /camera/ANativeWindowDisplayAdapter.cpp
parentd2d3968a441810c81cf9f46ff43af29cb6fdfb93 (diff)
downloadhardware_ti_omap4xxx-8e88af31129b8cc09675279ca2eac88256d8526b.zip
hardware_ti_omap4xxx-8e88af31129b8cc09675279ca2eac88256d8526b.tar.gz
hardware_ti_omap4xxx-8e88af31129b8cc09675279ca2eac88256d8526b.tar.bz2
Grallock lock and unlock fixes
1. Get and store Y and UV pointers from all gralloc handles to be used for preview callback and video frames. 2. Ensure gralloc lock is successfull before frame return to OMXCameraAdapter Change-Id: Ibeea6d00f2c1a1c45bcd2eafb22b90a795516e5c Signed-off-by: Akwasi Boateng <akwasi.boateng@ti.com>
Diffstat (limited to 'camera/ANativeWindowDisplayAdapter.cpp')
-rw-r--r--camera/ANativeWindowDisplayAdapter.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/camera/ANativeWindowDisplayAdapter.cpp b/camera/ANativeWindowDisplayAdapter.cpp
index 57c3a86..8b2bb9e 100644
--- a/camera/ANativeWindowDisplayAdapter.cpp
+++ b/camera/ANativeWindowDisplayAdapter.cpp
@@ -425,6 +425,7 @@ int ANativeWindowDisplayAdapter::disableDisplay(bool cancel_buffer)
// Unregister with the frame provider here
mFrameProvider->disableFrameNotification(CameraFrame::PREVIEW_FRAME_SYNC);
+ mFrameProvider->removeFramePointers();
if ( NULL != mDisplayThread.get() )
{
@@ -655,6 +656,7 @@ void* ANativeWindowDisplayAdapter::allocateBuffer(int width, int height, const c
mANativeWindow->lock_buffer(mANativeWindow, mBufferHandleMap[i]);
mapper.lock((buffer_handle_t) mGrallocHandleMap[i], CAMHAL_GRALLOC_USAGE, bounds, y_uv);
+ mFrameProvider->addFramePointers(mGrallocHandleMap[i] , y_uv);
}
// return the rest of the buffers back to ANativeWindow
@@ -672,6 +674,11 @@ void* ANativeWindowDisplayAdapter::allocateBuffer(int width, int height, const c
goto fail;
}
mFramesWithCameraAdapterMap.removeItem((int) mGrallocHandleMap[i]);
+ //LOCK UNLOCK TO GET YUV POINTERS
+ void *y_uv[2];
+ mapper.lock((buffer_handle_t) mGrallocHandleMap[i], CAMHAL_GRALLOC_USAGE, bounds, y_uv);
+ mFrameProvider->addFramePointers(mGrallocHandleMap[i] , y_uv);
+ mapper.unlock((buffer_handle_t) mGrallocHandleMap[i]);
}
mFirstInit = true;
@@ -1061,7 +1068,6 @@ status_t ANativeWindowDisplayAdapter::PostFrame(ANativeWindowDisplayAdapter::Dis
// unlock buffer before sending to display
mapper.unlock((buffer_handle_t) mGrallocHandleMap[i]);
-
ret = mANativeWindow->enqueue_buffer(mANativeWindow, mBufferHandleMap[i]);
if (ret != 0) {
LOGE("Surface::queueBuffer returned error %d", ret);
@@ -1171,7 +1177,18 @@ bool ANativeWindowDisplayAdapter::handleFrameReturn()
bounds.top = 0;
bounds.right = mFrameWidth;
bounds.bottom = mFrameHeight;
- mapper.lock((buffer_handle_t) mGrallocHandleMap[i], CAMHAL_GRALLOC_USAGE, bounds, y_uv);
+
+ int lock_try_count = 0;
+ while (mapper.lock((buffer_handle_t) mGrallocHandleMap[i], CAMHAL_GRALLOC_USAGE, bounds, y_uv) < 0){
+ if (++lock_try_count > LOCK_BUFFER_TRIES){
+ if ( NULL != mErrorNotifier.get() ){
+ mErrorNotifier->errorNotify(CAMERA_ERROR_UNKNOWN);
+ }
+ return false;
+ }
+ CAMHAL_LOGEA("Gralloc Lock FrameReturn Error: Sleeping 15ms");
+ usleep(15000);
+ }
mFramesWithCameraAdapterMap.add((int) mGrallocHandleMap[i], i);