summaryrefslogtreecommitdiff
path: root/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'camera/OMXCameraAdapter/OMXCameraAdapter.cpp')
-rwxr-xr-xcamera/OMXCameraAdapter/OMXCameraAdapter.cpp219
1 files changed, 150 insertions, 69 deletions
diff --git a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
index aa32ede0..a41327cb 100755
--- a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
+++ b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
@@ -78,12 +78,6 @@ status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps)
return NO_INIT;
}
- if (mComponentState != OMX_StateLoaded && mComponentState != OMX_StateInvalid) {
- CAMHAL_LOGEB("Error mComponentState %d is invalid!", mComponentState);
- LOG_FUNCTION_NAME_EXIT;
- return NO_INIT;
- }
-
///Update the preview and image capture port indexes
mCameraAdapterParameters.mPrevPortIndex = OMX_CAMERA_PORT_VIDEO_OUT_PREVIEW;
// temp changed in order to build OMX_CAMERA_PORT_VIDEO_OUT_IMAGE;
@@ -94,9 +88,10 @@ status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps)
eError = OMX_Init();
if (eError != OMX_ErrorNone) {
- CAMHAL_LOGEB("Error OMX_Init -0x%x", eError);
- return eError;
+ CAMHAL_LOGEB("OMX_Init() failed, error: 0x%x", eError);
+ return ErrorUtils::omxToAndroidError(eError);
}
+ mOmxInitialized = true;
///Get the handle to the OMX Component
eError = OMXCameraAdapter::OMXCameraGetHandle(&mCameraAdapterParameters.mHandleComp, (OMX_PTR)this);
@@ -105,6 +100,8 @@ status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps)
}
GOTO_EXIT_IF((eError != OMX_ErrorNone), eError);
+ mComponentState = OMX_StateLoaded;
+
CAMHAL_LOGVB("OMX_GetHandle -0x%x sensor_index = %lu", eError, mSensorIndex);
eError = OMX_SendCommand(mCameraAdapterParameters.mHandleComp,
OMX_CommandPortDisable,
@@ -176,7 +173,6 @@ status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps)
mRecording = false;
mWaitingForSnapshot = false;
mSnapshotCount = 0;
- mComponentState = OMX_StateLoaded;
mCapMode = HIGH_QUALITY;
mIPP = IPP_NULL;
@@ -281,14 +277,15 @@ status_t OMXCameraAdapter::initialize(CameraProperties::Properties* caps)
mMeasurementEnabled = false;
mFaceDetectionRunning = false;
mFaceDetectionPaused = false;
+ mFDSwitchAlgoPriority = false;
memset(&mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex], 0, sizeof(OMXCameraPortParameters));
memset(&mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex], 0, sizeof(OMXCameraPortParameters));
//Initialize 3A defaults
- ret = apply3ADefaults(mParameters3A);
+ ret = init3AParams(mParameters3A);
if ( NO_ERROR != ret ) {
- CAMHAL_LOGEA("Couldn't apply 3A defaults!");
+ CAMHAL_LOGEA("Couldn't init 3A params!");
goto EXIT;
}
@@ -541,6 +538,8 @@ status_t OMXCameraAdapter::setParameters(const CameraParameters &params)
mOMXStateSwitch = true;
}
+#ifdef OMAP_ENHANCEMENT
+
if ( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL )
{
if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_ENABLE) == 0)
@@ -562,6 +561,8 @@ status_t OMXCameraAdapter::setParameters(const CameraParameters &params)
mMeasurementEnabled = false;
}
+#endif
+
ret |= setParametersCapture(params, state);
ret |= setParameters3A(params, state);
@@ -594,7 +595,7 @@ void saveFile(unsigned char *buff, int width, int height, int format) {
sprintf(fn, "/preview%03d.yuv", counter);
fd = open(fn, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC, 0777);
if(fd < 0) {
- LOGE("Unable to open file %s: %s", fn, strerror(fd));
+ ALOGE("Unable to open file %s: %s", fn, strerror(fd));
return;
}
@@ -682,6 +683,8 @@ void OMXCameraAdapter::getParameters(CameraParameters& params)
mParameters.get(CameraParameters::KEY_FOCUS_DISTANCES));
}
+#ifdef OMAP_ENHANCEMENT
+
OMX_INIT_STRUCT_PTR (&exp, OMX_CONFIG_EXPOSUREVALUETYPE);
exp.nPortIndex = OMX_ALL;
@@ -697,6 +700,8 @@ void OMXCameraAdapter::getParameters(CameraParameters& params)
CAMHAL_LOGEB("OMX error 0x%x, while retrieving current ISO value", eError);
}
+#endif
+
{
Mutex::Autolock lock(mZoomLock);
//Immediate zoom should not be avaialable while smooth zoom is running
@@ -750,7 +755,6 @@ void OMXCameraAdapter::getParameters(CameraParameters& params)
params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr);
}
-
LOG_FUNCTION_NAME_EXIT;
}
@@ -1743,6 +1747,8 @@ status_t OMXCameraAdapter::UseBuffersPreview(void* bufArr, int num)
///If there is any failure, we reach here.
///Here, we do any resource freeing and convert from OMX error code to Camera Hal error code
EXIT:
+ mStateSwitchLock.unlock();
+
CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError);
performCleanupAfterError();
CAMHAL_LOGEB("Exiting function %s because of ret %d eError=%x", __FUNCTION__, ret, eError);
@@ -1758,15 +1764,14 @@ status_t OMXCameraAdapter::startPreview()
OMX_ERRORTYPE eError = OMX_ErrorNone;
OMXCameraPortParameters *mPreviewData = NULL;
OMXCameraPortParameters *measurementData = NULL;
- OMX_CONFIG_EXTRADATATYPE extraDataControl;
LOG_FUNCTION_NAME;
if( 0 != mStartPreviewSem.Count() )
{
CAMHAL_LOGEB("Error mStartPreviewSem semaphore count %d", mStartPreviewSem.Count());
- LOG_FUNCTION_NAME_EXIT;
- return NO_INIT;
+ ret = NO_INIT;
+ goto EXIT;
}
mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex];
@@ -1870,15 +1875,7 @@ status_t OMXCameraAdapter::startPreview()
// whether the preview frame is a snapshot
if ( OMX_ErrorNone == eError)
{
- OMX_INIT_STRUCT_PTR (&extraDataControl, OMX_CONFIG_EXTRADATATYPE);
- extraDataControl.nPortIndex = OMX_ALL;
- extraDataControl.eExtraDataType = OMX_AncillaryData;
- extraDataControl.bEnable = OMX_TRUE;
-
- eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
- ( OMX_INDEXTYPE ) OMX_IndexConfigOtherExtraDataControl,
- &extraDataControl);
- GOTO_EXIT_IF((eError!=OMX_ErrorNone), eError);
+ ret = setExtraData(true, OMX_ALL, OMX_AncillaryData);
}
@@ -1935,6 +1932,14 @@ status_t OMXCameraAdapter::stopPreview()
mCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mImagePortIndex];
measurementData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mMeasurementPortIndex];
+ if (mAdapterState == LOADED_PREVIEW_STATE) {
+ // Something happened in CameraHal between UseBuffers and startPreview
+ // this means that state switch is still locked..so we need to unlock else
+ // deadlock will occur on the next start preview
+ mStateSwitchLock.unlock();
+ return NO_ERROR;
+ }
+
if ( mComponentState != OMX_StateExecuting )
{
CAMHAL_LOGEA("Calling StopPreview() when not in EXECUTING state");
@@ -2707,6 +2712,7 @@ OMX_ERRORTYPE OMXCameraAdapter::SignalEvent(OMX_IN OMX_HANDLETYPE hComponent,
{
Mutex::Autolock lock(mEventLock);
TIUTILS::Message *msg;
+ bool eventSignalled = false;
LOG_FUNCTION_NAME;
@@ -2730,6 +2736,7 @@ OMX_ERRORTYPE OMXCameraAdapter::SignalEvent(OMX_IN OMX_HANDLETYPE hComponent,
//Signal the semaphore provided
sem->Signal();
free(msg);
+ eventSignalled = true;
break;
}
}
@@ -2740,6 +2747,19 @@ OMX_ERRORTYPE OMXCameraAdapter::SignalEvent(OMX_IN OMX_HANDLETYPE hComponent,
CAMHAL_LOGDA("Event queue empty!!!");
}
+ // Special handling for any unregistered events
+ if (!eventSignalled) {
+ // Handling for focus callback
+ if ((nData2 == OMX_IndexConfigCommonFocusStatus) &&
+ (eEvent == (OMX_EVENTTYPE) OMX_EventIndexSettingChanged)) {
+ TIUTILS::Message msg;
+ msg.command = OMXCallbackHandler::CAMERA_FOCUS_STATUS;
+ msg.arg1 = NULL;
+ msg.arg2 = NULL;
+ mOMXCallbackHandler->put(&msg);
+ }
+ }
+
LOG_FUNCTION_NAME_EXIT;
return OMX_ErrorNone;
@@ -2867,7 +2887,7 @@ static void debugShowFPS()
mFps = ((mFrameCount - mLastFrameCount) * float(s2ns(1))) / diff;
mLastFpsTime = now;
mLastFrameCount = mFrameCount;
- LOGD("Camera %d Frames, %f FPS", mFrameCount, mFps);
+ ALOGD("Camera %d Frames, %f FPS", mFrameCount, mFps);
}
// XXX: mFPS has the value we want
}
@@ -2919,7 +2939,7 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE
CameraFrame cameraFrame;
OMX_TI_PLATFORMPRIVATE *platformPrivate;
OMX_OTHER_EXTRADATATYPE *extraData;
- OMX_TI_ANCILLARYDATATYPE *ancillaryData;
+ OMX_TI_ANCILLARYDATATYPE *ancillaryData = NULL;
bool snapshotFrame = false;
res1 = res2 = NO_ERROR;
@@ -2952,7 +2972,6 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE
}
recalculateFPS();
-
{
Mutex::Autolock lock(mFaceDetectionLock);
if ( mFaceDetectionRunning && !mFaceDetectionPaused ) {
@@ -2961,12 +2980,18 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE
notifyFaceSubscribers(fdResult);
fdResult.clear();
}
- }
- }
+ if ( mFDSwitchAlgoPriority ) {
- if ( (nextState & CAPTURE_ACTIVE) )
- {
- mPending3Asettings |= SetFocus;
+ //Disable region priority and enable face priority for AF
+ setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, false);
+ setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO , true);
+
+ //Disable Region priority and enable Face priority
+ setAlgoPriority(REGION_PRIORITY, EXPOSURE_ALGO, false);
+ setAlgoPriority(FACE_PRIORITY, EXPOSURE_ALGO, true);
+ mFDSwitchAlgoPriority = false;
+ }
+ }
}
///Prepare the frames to be sent - initialize CameraFrame object and reference count
@@ -2978,6 +3003,16 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE
{
typeOfFrame = CameraFrame::SNAPSHOT_FRAME;
mask = (unsigned int)CameraFrame::SNAPSHOT_FRAME;
+
+ // video snapshot gets ancillary data and wb info from last snapshot frame
+ mCaptureAncillaryData = ancillaryData;
+ mWhiteBalanceData = NULL;
+ extraData = getExtradata((OMX_OTHER_EXTRADATATYPE*) platformPrivate->pMetaDataBuffer,
+ (OMX_EXTRADATATYPE) OMX_WhiteBalance);
+ if ( NULL != extraData )
+ {
+ mWhiteBalanceData = (OMX_TI_WHITEBALANCERESULTTYPE*) extraData->data;
+ }
}
else
{
@@ -2991,7 +3026,7 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE
mFramesWithEncoder++;
}
- //LOGV("FBD pBuffer = 0x%x", pBuffHeader->pBuffer);
+ //ALOGV("FBD pBuffer = 0x%x", pBuffHeader->pBuffer);
if( mWaitingForSnapshot )
{
@@ -3012,8 +3047,8 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE
#ifdef DEBUG_LOG
if(mBuffersWithDucati.indexOfKey((int)pBuffHeader->pBuffer)<0)
{
- LOGE("Buffer was never with Ducati!! 0x%x", pBuffHeader->pBuffer);
- for(int i=0;i<mBuffersWithDucati.size();i++) LOGE("0x%x", mBuffersWithDucati.keyAt(i));
+ ALOGE("Buffer was never with Ducati!! 0x%x", pBuffHeader->pBuffer);
+ for(int i=0;i<mBuffersWithDucati.size();i++) ALOGE("0x%x", mBuffersWithDucati.keyAt(i));
}
mBuffersWithDucati.removeItem((int)pBuffHeader->pBuffer);
#endif
@@ -3026,10 +3061,13 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE
// On the fly update to 3A settings not working
// Do not update 3A here if we are in the middle of a capture
// or in the middle of transitioning to it
- if( mPending3Asettings && ((nextState & CAPTURE_ACTIVE) == 0))
+ if( mPending3Asettings &&
+ ( (nextState & CAPTURE_ACTIVE) == 0 ) &&
+ ( (state & CAPTURE_ACTIVE) == 0 ) )
{
apply3Asettings(mParameters3A);
}
+
}
else if( pBuffHeader->nOutputPortIndex == OMX_CAMERA_PORT_VIDEO_OUT_MEASUREMENT )
{
@@ -3064,7 +3102,7 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE
// populate exif data and pass to subscribers via quirk
// subscriber is in charge of freeing exif data
ExifElementsTable* exif = new ExifElementsTable();
- setupEXIF_libjpeg(exif);
+ setupEXIF_libjpeg(exif, mCaptureAncillaryData, mWhiteBalanceData);
cameraFrame.mQuirks |= CameraFrame::HAS_EXIF_DATA;
cameraFrame.mCookie2 = (void*) exif;
}
@@ -3368,6 +3406,11 @@ bool OMXCameraAdapter::OMXCallbackHandler::Handler()
( OMX_BUFFERHEADERTYPE *) msg.arg2);
break;
}
+ case OMXCallbackHandler::CAMERA_FOCUS_STATUS:
+ {
+ mCameraAdapter->handleFocusCallback();
+ break;
+ }
case CommandHandler::COMMAND_EXIT:
{
CAMHAL_LOGDA("Exiting OMX callback handler");
@@ -3381,6 +3424,41 @@ bool OMXCameraAdapter::OMXCallbackHandler::Handler()
return false;
}
+status_t OMXCameraAdapter::setExtraData(bool enable, OMX_U32 nPortIndex, OMX_EXT_EXTRADATATYPE eType) {
+ status_t ret = NO_ERROR;
+ OMX_ERRORTYPE eError = OMX_ErrorNone;
+ OMX_CONFIG_EXTRADATATYPE extraDataControl;
+
+ LOG_FUNCTION_NAME;
+
+ if ( ( OMX_StateInvalid == mComponentState ) ||
+ ( NULL == mCameraAdapterParameters.mHandleComp ) ) {
+ CAMHAL_LOGEA("OMX component is in invalid state");
+ return -EINVAL;
+ }
+
+ OMX_INIT_STRUCT_PTR (&extraDataControl, OMX_CONFIG_EXTRADATATYPE);
+
+ extraDataControl.nPortIndex = nPortIndex;
+ extraDataControl.eExtraDataType = eType;
+ extraDataControl.eCameraView = OMX_2D;
+
+ if (enable) {
+ extraDataControl.bEnable = OMX_TRUE;
+ } else {
+ extraDataControl.bEnable = OMX_FALSE;
+ }
+
+ eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
+ (OMX_INDEXTYPE) OMX_IndexConfigOtherExtraDataControl,
+ &extraDataControl);
+
+ LOG_FUNCTION_NAME_EXIT;
+
+ return (ret | ErrorUtils::omxToAndroidError(eError));
+}
+
+
OMX_OTHER_EXTRADATATYPE *OMXCameraAdapter::getExtradata(OMX_OTHER_EXTRADATATYPE *extraData, OMX_EXTRADATATYPE type)
{
if ( NULL != extraData )
@@ -3398,17 +3476,18 @@ OMX_OTHER_EXTRADATATYPE *OMXCameraAdapter::getExtradata(OMX_OTHER_EXTRADATATYPE
return NULL;
}
-OMXCameraAdapter::OMXCameraAdapter(size_t sensor_index): mComponentState (OMX_StateLoaded)
+OMXCameraAdapter::OMXCameraAdapter(size_t sensor_index)
{
LOG_FUNCTION_NAME;
+ mOmxInitialized = false;
+ mComponentState = OMX_StateInvalid;
mSensorIndex = sensor_index;
mPictureRotation = 0;
// Initial values
mTimeSourceDelta = 0;
onlyOnce = true;
- mDoAFSem.Create(0);
mInitSem.Create(0);
mFlushSem.Create(0);
mUsePreviewDataSem.Create(0);
@@ -3441,22 +3520,22 @@ OMXCameraAdapter::~OMXCameraAdapter()
Mutex::Autolock lock(gAdapterLock);
- //Return to OMX Loaded state
- switchToLoaded();
+ if ( mOmxInitialized ) {
+ // return to OMX Loaded state
+ switchToLoaded();
- ///De-init the OMX
- if( (mComponentState==OMX_StateLoaded) || (mComponentState==OMX_StateInvalid))
- {
- ///Free the handle for the Camera component
- if(mCameraAdapterParameters.mHandleComp)
- {
- OMX_FreeHandle(mCameraAdapterParameters.mHandleComp);
- mCameraAdapterParameters.mHandleComp = NULL;
+ // deinit the OMX
+ if ( mComponentState == OMX_StateLoaded || mComponentState == OMX_StateInvalid ) {
+ // free the handle for the Camera component
+ if ( mCameraAdapterParameters.mHandleComp ) {
+ OMX_FreeHandle(mCameraAdapterParameters.mHandleComp);
+ mCameraAdapterParameters.mHandleComp = NULL;
}
-
- OMX_Deinit();
}
+ OMX_Deinit();
+ mOmxInitialized = false;
+ }
//Remove any unhandled events
if ( !mEventSignalQ.isEmpty() )
@@ -3526,28 +3605,30 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraGetHandle(OMX_HANDLETYPE *handle, OMX_P
{
OMX_ERRORTYPE eError = OMX_ErrorUndefined;
- int retries = 5;
- while(eError!=OMX_ErrorNone && --retries>=0) {
+ for ( int i = 0; i < 5; ++i ) {
+ if ( i > 0 ) {
+ // sleep for 100 ms before next attempt
+ usleep(100000);
+ }
- // Setup key parameters to send to Ducati during init
- OMX_CALLBACKTYPE oCallbacks;
+ // setup key parameters to send to Ducati during init
+ OMX_CALLBACKTYPE oCallbacks;
- // Initialize the callback handles
- oCallbacks.EventHandler = android::OMXCameraAdapterEventHandler;
- oCallbacks.EmptyBufferDone = android::OMXCameraAdapterEmptyBufferDone;
- oCallbacks.FillBufferDone = android::OMXCameraAdapterFillBufferDone;
+ // initialize the callback handles
+ oCallbacks.EventHandler = android::OMXCameraAdapterEventHandler;
+ oCallbacks.EmptyBufferDone = android::OMXCameraAdapterEmptyBufferDone;
+ oCallbacks.FillBufferDone = android::OMXCameraAdapterFillBufferDone;
- // Get Handle
- eError = OMX_GetHandle(handle, (OMX_STRING)"OMX.TI.DUCATI1.VIDEO.CAMERA", pAppData, &oCallbacks);
- if (eError != OMX_ErrorNone) {
- CAMHAL_LOGEB("OMX_GetHandle -0x%x", eError);
- //Sleep for 100 mS
- usleep(100000);
- } else {
- break;
- }
+ // get handle
+ eError = OMX_GetHandle(handle, (OMX_STRING)"OMX.TI.DUCATI1.VIDEO.CAMERA", pAppData, &oCallbacks);
+ if ( eError == OMX_ErrorNone ) {
+ return OMX_ErrorNone;
+ }
+
+ CAMHAL_LOGEB("OMX_GetHandle() failed, error: 0x%x", eError);
}
+ *handle = 0;
return eError;
}