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 | fa12194f9ecde1c7f90a2bbd013c50203684b5d7 (patch) | |
| tree | 79a51e0b0acf8df081467dde1e94ca725cec4048 /camera/ANativeWindowDisplayAdapter.cpp | |
| parent | 0377a794ee13528c866b0c7f071097d75a7d9828 (diff) | |
| download | hardware_ti_omap4-fa12194f9ecde1c7f90a2bbd013c50203684b5d7.tar.gz hardware_ti_omap4-fa12194f9ecde1c7f90a2bbd013c50203684b5d7.tar.bz2 hardware_ti_omap4-fa12194f9ecde1c7f90a2bbd013c50203684b5d7.zip | |
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); |
