summaryrefslogtreecommitdiffstats
path: root/camera
diff options
context:
space:
mode:
authorAkwasi Boateng <akwasi.boateng@ti.com>2011-09-09 12:50:14 -0500
committerIliyan Malchev <malchev@google.com>2011-09-12 16:09:58 -0700
commit302c9be47228c8da68fe88e5e39069b6d92e24a2 (patch)
tree7adf5478831039b3c22002ccbda77a934517c486 /camera
parent66c3c1ee3b437116654c7cb68bc71ba2358f6463 (diff)
downloadhardware_ti_omap4-302c9be47228c8da68fe88e5e39069b6d92e24a2.zip
hardware_ti_omap4-302c9be47228c8da68fe88e5e39069b6d92e24a2.tar.gz
hardware_ti_omap4-302c9be47228c8da68fe88e5e39069b6d92e24a2.tar.bz2
Unblock semaphores during Fatal Errors
1. Remove all pending events and unblock all waiting semaphore during Fatal error. 2. Exit execution when in invalid state. 3. Remove error nitiifcation from Appcallback thread Change-Id: I1612ff75e83ebf285d4cc168a829e0f81d4968b1 Signed-off-by: Akwasi Boateng <akwasi.boateng@ti.com>
Diffstat (limited to 'camera')
-rw-r--r--camera/AppCallbackNotifier.cpp25
-rw-r--r--camera/CameraHal.cpp2
-rw-r--r--camera/OMXCameraAdapter/OMXCameraAdapter.cpp106
-rw-r--r--camera/OMXCameraAdapter/OMXCapture.cpp31
-rw-r--r--camera/OMXCameraAdapter/OMXFocus.cpp17
-rw-r--r--camera/inc/OMXCameraAdapter/OMXCameraAdapter.h1
6 files changed, 150 insertions, 32 deletions
diff --git a/camera/AppCallbackNotifier.cpp b/camera/AppCallbackNotifier.cpp
index b737c75..9ff7946 100644
--- a/camera/AppCallbackNotifier.cpp
+++ b/camera/AppCallbackNotifier.cpp
@@ -174,12 +174,13 @@ void AppCallbackNotifier::errorNotify(int error)
CAMHAL_LOGEB("AppCallbackNotifier received error %d", error);
- ///Notify errors to application in callback thread. Post error event to event queue
- TIUTILS::Message msg;
- msg.command = AppCallbackNotifier::NOTIFIER_CMD_PROCESS_ERROR;
- msg.arg1 = (void*)error;
-
- mEventQ.put(&msg);
+ if ( ( NULL != mCameraHal ) &&
+ ( NULL != mNotifyCb ) &&
+ ( mCameraHal->msgTypeEnabled(CAMERA_MSG_ERROR) ) )
+ {
+ CAMHAL_LOGEB("AppCallbackNotifier mNotifyCb %d", error);
+ mNotifyCb(CAMERA_MSG_ERROR, CAMERA_ERROR_UNKNOWN, 0, mCallbackCookie);
+ }
LOG_FUNCTION_NAME_EXIT;
}
@@ -340,18 +341,6 @@ void AppCallbackNotifier::notifyEvent()
}
break;
-
- case AppCallbackNotifier::NOTIFIER_CMD_PROCESS_ERROR:
-
- if ( ( NULL != mCameraHal ) &&
- ( NULL != mNotifyCb ) &&
- ( mCameraHal->msgTypeEnabled(CAMERA_MSG_ERROR) ) )
- {
- mNotifyCb(CAMERA_MSG_ERROR, CAMERA_ERROR_UNKNOWN, 0, mCallbackCookie);
- }
-
- break;
-
}
if ( NULL != evt )
diff --git a/camera/CameraHal.cpp b/camera/CameraHal.cpp
index 10b8716..089768a 100644
--- a/camera/CameraHal.cpp
+++ b/camera/CameraHal.cpp
@@ -1503,7 +1503,7 @@ status_t CameraHal::startPreview()
mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
if(mDisplayAdapter.get() != NULL)
{
- mDisplayAdapter->disableDisplay();
+ mDisplayAdapter->disableDisplay(false);
}
mAppCallbackNotifier->stop();
mPreviewStartInProgress = false;
diff --git a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
index 0d05b28..79a42d9 100644
--- a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
+++ b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
@@ -45,7 +45,6 @@ namespace android {
static OMXCameraAdapter *gCameraAdapter = NULL;
Mutex gAdapterLock;
-
/*--------------------Camera Adapter Class STARTS here-----------------------------*/
status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps, int sensor_index)
@@ -161,6 +160,14 @@ status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps, int se
//Wait for the port enable event to occur
ret = mInitSem.WaitTimeout(OMX_CMD_TIMEOUT);
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after Enable Preview Port Exitting!!!");
+ goto EXIT;
+ }
+
if ( NO_ERROR == ret )
{
CAMHAL_LOGDA("-Port enable event arrived");
@@ -1071,6 +1078,14 @@ status_t OMXCameraAdapter::flushBuffers()
///Wait for the FLUSH event to occur
ret = mFlushSem.WaitTimeout(OMX_CMD_TIMEOUT);
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after Flush Exitting!!!");
+ goto EXIT;
+ }
+
if ( NO_ERROR == ret )
{
CAMHAL_LOGDA("Flush event received");
@@ -1217,6 +1232,13 @@ status_t OMXCameraAdapter::UseBuffersPreviewData(void* bufArr, int num)
{
ret = mUsePreviewDataSem.WaitTimeout(OMX_CMD_TIMEOUT);
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after measurement port enable Exitting!!!");
+ return EINVAL;
+ }
+
if ( NO_ERROR == ret )
{
CAMHAL_LOGDA("Port enable event arrived on measurement port");
@@ -1246,9 +1268,9 @@ status_t OMXCameraAdapter::switchToLoaded()
LOG_FUNCTION_NAME;
- if ( mComponentState == OMX_StateLoaded )
+ if ( mComponentState == OMX_StateLoaded || mComponentState == OMX_StateInvalid)
{
- CAMHAL_LOGDA("Already in OMX_Loaded state");
+ CAMHAL_LOGDA("Already in OMX_Loaded state or OMX_StateInvalid state");
goto EXIT;
}
@@ -1289,6 +1311,14 @@ status_t OMXCameraAdapter::switchToLoaded()
CAMHAL_LOGDA("EXECUTING->IDLE state changed");
ret = mSwitchToLoadedSem.WaitTimeout(OMX_CMD_TIMEOUT);
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after EXECUTING->IDLE Exitting!!!");
+ goto EXIT;
+ }
+
if ( NO_ERROR == ret )
{
CAMHAL_LOGDA("EXECUTING->IDLE state changed");
@@ -1332,6 +1362,14 @@ status_t OMXCameraAdapter::switchToLoaded()
CAMHAL_LOGDA("Switching IDLE->LOADED state");
ret = mSwitchToLoadedSem.WaitTimeout(OMX_CMD_TIMEOUT);
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after IDLE->LOADED Exitting!!!");
+ goto EXIT;
+ }
+
if ( NO_ERROR == ret )
{
CAMHAL_LOGDA("IDLE->LOADED state changed");
@@ -1375,6 +1413,14 @@ status_t OMXCameraAdapter::switchToLoaded()
CAMHAL_LOGDA("Enabling Preview port");
///Wait for state to switch to idle
ret = mSwitchToLoadedSem.WaitTimeout(OMX_CMD_TIMEOUT);
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after Enabling Preview port Exitting!!!");
+ goto EXIT;
+ }
+
if ( NO_ERROR == ret )
{
CAMHAL_LOGDA("Preview port enabled!");
@@ -1646,6 +1692,14 @@ status_t OMXCameraAdapter::UseBuffersPreview(void* bufArr, int num)
CAMHAL_LOGDA("Registering preview buffers");
ret = mUsePreviewSem.WaitTimeout(OMX_CMD_TIMEOUT);
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after Registering preview buffers Exitting!!!");
+ goto EXIT;
+ }
+
if ( NO_ERROR == ret )
{
CAMHAL_LOGDA("Preview buffer registration successfull");
@@ -1736,6 +1790,14 @@ status_t OMXCameraAdapter::startPreview()
CAMHAL_LOGDA("+Waiting for component to go into EXECUTING state");
ret = mStartPreviewSem.WaitTimeout(OMX_CMD_TIMEOUT);
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after IDLE_EXECUTING Exitting!!!");
+ goto EXIT;
+ }
+
if ( NO_ERROR == ret )
{
CAMHAL_LOGDA("+Great. Component went into executing state!!");
@@ -1917,6 +1979,14 @@ status_t OMXCameraAdapter::stopPreview()
CAMHAL_LOGDA("Disabling preview port");
ret = mStopPreviewSem.WaitTimeout(OMX_CMD_TIMEOUT);
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after Disabling preview port Exitting!!!");
+ goto EXIT;
+ }
+
if ( NO_ERROR == ret )
{
CAMHAL_LOGDA("Preview port disabled");
@@ -2454,6 +2524,29 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterEventHandler(OMX_IN OMX_HANDLETY
{
CAMHAL_LOGEA("***Got Fatal Error Notification***\n");
mComponentState = OMX_StateInvalid;
+ /*
+ Remove any unhandled events and
+ unblock any waiting semaphores
+ */
+ if ( !mEventSignalQ.isEmpty() )
+ {
+ for (int i = 0 ; i < mEventSignalQ.size(); i++ )
+ {
+ CAMHAL_LOGEB("***Removing %d EVENTS***** \n", mEventSignalQ.size());
+ //remove from queue and free msg
+ TIUTILS::Message *msg = mEventSignalQ.itemAt(i);
+ if ( NULL != msg )
+ {
+ Semaphore *sem = (Semaphore*) msg->arg3;
+ mEventSignalQ.removeAt(i);
+ if ( sem )
+ {
+ sem->Signal();
+ }
+ free(msg);
+ }
+ }
+ }
///Report Error to App
mErrorNotifier->errorNotify(CAMERA_ERROR_UNKNOWN);
}
@@ -3076,7 +3169,7 @@ bool OMXCameraAdapter::OMXCallbackHandler::Handler()
return false;
}
-OMXCameraAdapter::OMXCameraAdapter():mComponentState (OMX_StateInvalid)
+OMXCameraAdapter::OMXCameraAdapter():mComponentState (OMX_StateLoaded)
{
LOG_FUNCTION_NAME;
@@ -3134,10 +3227,13 @@ OMXCameraAdapter::~OMXCameraAdapter()
{
TIUTILS::Message *msg = mEventSignalQ.itemAt(i);
//remove from queue and free msg
- mEventSignalQ.removeAt(i);
if ( NULL != msg )
{
+ Semaphore *sem = (Semaphore*) msg->arg3;
+ mEventSignalQ.removeAt(i);
+ sem->Signal();
free(msg);
+
}
}
}
diff --git a/camera/OMXCameraAdapter/OMXCapture.cpp b/camera/OMXCameraAdapter/OMXCapture.cpp
index 6626e2f..02cabc4 100644
--- a/camera/OMXCameraAdapter/OMXCapture.cpp
+++ b/camera/OMXCameraAdapter/OMXCapture.cpp
@@ -798,6 +798,13 @@ status_t OMXCameraAdapter::startImageCapture()
ret = mStartCaptureSem.WaitTimeout(OMX_CAPTURE_TIMEOUT);
}
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after Image Capture Exitting!!!");
+ goto EXIT;
+ }
+
if ( NO_ERROR == ret )
{
CAMHAL_LOGDA("Shutter callback received");
@@ -883,6 +890,14 @@ status_t OMXCameraAdapter::stopImageCapture()
//Wait here for the capture to be done, in worst case timeout and proceed with cleanup
ret = mCaptureSem.WaitTimeout(OMX_CAPTURE_TIMEOUT);
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State Image Capture Stop Exitting!!!");
+ goto EXIT;
+ }
+
if ( NO_ERROR != ret ) {
ret |= RemoveEvent(mCameraAdapterParameters.mHandleComp,
(OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
@@ -938,6 +953,14 @@ status_t OMXCameraAdapter::stopImageCapture()
CAMHAL_LOGDA("Waiting for port disable");
//Wait for the image port enable event
ret = mStopCaptureSem.WaitTimeout(OMX_CMD_TIMEOUT);
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after Disable Image Port Exitting!!!");
+ goto EXIT;
+ }
+
if ( NO_ERROR == ret ) {
CAMHAL_LOGDA("Port disabled");
} else {
@@ -1060,6 +1083,14 @@ status_t OMXCameraAdapter::UseBuffersCapture(void* bufArr, int num)
//Wait for the image port enable event
CAMHAL_LOGDA("Waiting for port enable");
ret = mUseCaptureSem.WaitTimeout(OMX_CMD_TIMEOUT);
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after Enable Image Port Exitting!!!");
+ goto EXIT;
+ }
+
if ( ret == NO_ERROR )
{
CAMHAL_LOGDA("Port enabled");
diff --git a/camera/OMXCameraAdapter/OMXFocus.cpp b/camera/OMXCameraAdapter/OMXFocus.cpp
index f7e781e..0482aa8 100644
--- a/camera/OMXCameraAdapter/OMXFocus.cpp
+++ b/camera/OMXCameraAdapter/OMXFocus.cpp
@@ -146,14 +146,17 @@ status_t OMXCameraAdapter::doAutoFocus()
if ( ( focusControl.eFocusControl != OMX_IMAGE_FocusControlAuto ) &&
( focusControl.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE )
OMX_IMAGE_FocusControlAutoInfinity ) ) {
- //ret = mDoAFSem.WaitTimeout(AF_CALLBACK_TIMEOUT);
- //Disable auto focus callback from Ducati
- //setFocusCallback(false);
- //Signal a dummy AF event so that in case the callback from ducati
- //does come then it doesnt crash after
- //exiting this function since eventSem will go out of scope.
+
if(mDoAFSem.WaitTimeout(AF_CALLBACK_TIMEOUT) != NO_ERROR) {
- //Disable auto focus callback from Ducati
+
+ //If somethiing bad happened while we wait
+ if (mComponentState == OMX_StateInvalid)
+ {
+ CAMHAL_LOGEA("Invalid State after Auto Focus Exitting!!!");
+ return EINVAL;
+ }
+
+ //Disable auto focus callback from Ducati
setFocusCallback(false);
CAMHAL_LOGEA("Autofocus callback timeout expired");
RemoveEvent(mCameraAdapterParameters.mHandleComp,
diff --git a/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h b/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h
index a29095d..b7d7f2d 100644
--- a/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h
+++ b/camera/inc/OMXCameraAdapter/OMXCameraAdapter.h
@@ -50,7 +50,6 @@ namespace android {
#define Q16_OFFSET 16
#define OMX_CMD_TIMEOUT 3000000 //3 sec.
-#define AF_CALLBACK_TIMEOUT 10000000 //10 seconds timeout
#define OMX_CAPTURE_TIMEOUT 5000000 //5 sec.
#define FOCUS_THRESHOLD 5 //[s.]