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
commitfa12194f9ecde1c7f90a2bbd013c50203684b5d7 (patch)
tree79a51e0b0acf8df081467dde1e94ca725cec4048 /camera/ANativeWindowDisplayAdapter.cpp
parent0377a794ee13528c866b0c7f071097d75a7d9828 (diff)
downloadhardware_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.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);