diff options
author | Akwasi Boateng <akwasi.boateng@ti.com> | 2011-09-15 19:50:02 -0500 |
---|---|---|
committer | Iliyan Malchev <malchev@google.com> | 2011-09-21 16:10:54 -0700 |
commit | 8e88af31129b8cc09675279ca2eac88256d8526b (patch) | |
tree | 16105c32ab4a06fe22e31a88951b7e113ea3668e /camera/ANativeWindowDisplayAdapter.cpp | |
parent | d2d3968a441810c81cf9f46ff43af29cb6fdfb93 (diff) | |
download | hardware_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.cpp | 21 |
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); |