SensorListener::~SensorListener() { LOG_FUNCTION_NAME; CAMHAL_LOGDA("Kill looper thread"); if (mSensorLooperThread.get()) { // 1. Request exit // 2. Wake up looper which should be polling for an event // 3. Wait for exit mSensorLooperThread->requestExit(); mSensorLooperThread->wake(); mSensorLooperThread->join(); mSensorLooperThread.clear(); mSensorLooperThread = NULL; } CAMHAL_LOGDA("Kill looper"); if (mLooper.get()) { mLooper->removeFd(mSensorEventQueue->getFd()); mLooper.clear(); mLooper = NULL; } CAMHAL_LOGDA("SensorListener destroyed"); LOG_FUNCTION_NAME_EXIT; }
status_t OMXCameraAdapter::getCaps(CameraProperties::Properties* params, OMX_HANDLETYPE handle) { status_t ret = NO_ERROR; int caps_size = 0; OMX_ERRORTYPE eError = OMX_ErrorNone; OMX_TI_CAPTYPE** caps = NULL;; OMX_TI_CONFIG_SHAREDBUFFER sharedBuffer; MemoryManager memMgr; LOG_FUNCTION_NAME; // allocate tiler (or ion) buffer for caps (size is always a multiple of 4K) caps_size = ((sizeof(OMX_TI_CAPTYPE)+4095)/4096)*4096; caps = (OMX_TI_CAPTYPE**) memMgr.allocateBuffer(0, 0, NULL, caps_size, 1); if (!caps) { CAMHAL_LOGEB("Error allocating buffer for caps %d", eError); ret = -ENOMEM; goto EXIT; } // initialize structures to be passed to OMX Camera OMX_INIT_STRUCT_PTR (caps[0], OMX_TI_CAPTYPE); caps[0]->nPortIndex = OMX_ALL; OMX_INIT_STRUCT_PTR (&sharedBuffer, OMX_TI_CONFIG_SHAREDBUFFER); sharedBuffer.nPortIndex = OMX_ALL; sharedBuffer.nSharedBuffSize = caps_size; sharedBuffer.pSharedBuff = (OMX_U8 *) caps[0]; // Get capabilities from OMX Camera CAMHAL_LOGEB("Calling OMX_GetConfig() for OMX_TI_IndexConfigCamCapabilities %d", 0); /* FIXME-HASH: Fix this */ eError = OMX_GetConfig(handle, (OMX_INDEXTYPE) OMX_TI_IndexConfigCamCapabilities, &sharedBuffer); if ( OMX_ErrorNone != eError ) { CAMHAL_LOGEB("Error during capabilities query 0x%x", eError); /* FIXME-HASH: Removed the query as it will fail for GB syslink */ // ret = UNKNOWN_ERROR; // goto EXIT; } else { CAMHAL_LOGDA("OMX capability query success"); } // Translate and insert Ducati capabilities to CameraProperties if ( NO_ERROR == ret ) { ret = insertCapabilities(params, *caps[0]); } CAMHAL_LOGDB("sen mount id=%u", (unsigned int)caps[0]->tSenMounting.nSenId); EXIT: if (caps) { memMgr.freeBuffer((void*) caps); caps = NULL; } LOG_FUNCTION_NAME_EXIT; return ret; }
void OMXCameraAdapter::handleFocusCallback() { OMX_PARAM_FOCUSSTATUSTYPE eFocusStatus; CameraHalEvent::FocusStatus focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; status_t ret = NO_ERROR; BaseCameraAdapter::AdapterState nextState; BaseCameraAdapter::getNextState(nextState); OMX_INIT_STRUCT(eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); ret = checkFocus(&eFocusStatus); if (NO_ERROR != ret) { CAMHAL_LOGEA("Focus status check failed!"); // signal and unblock doAutoFocus if (AF_ACTIVE & nextState) { Mutex::Autolock lock(mDoAFMutex); mDoAFCond.broadcast(); } return; } if ( ( eFocusStatus.eFocusStatus != OMX_FocusStatusRequest ) && ( eFocusStatus.eFocusStatus != OMX_FocusStatusOff ) ) { // signal doAutoFocus when a end of scan message comes // ignore start of scan Mutex::Autolock lock(mDoAFMutex); mDoAFCond.broadcast(); } if (mParameters3A.Focus != (OMX_IMAGE_FOCUSCONTROLTYPE) OMX_IMAGE_FocusControlAuto) { CAMHAL_LOGDA("unregistered focus callback when not in CAF or doAutoFocus... not handling"); return; } // Handling for CAF Callbacks switch (eFocusStatus.eFocusStatus) { case OMX_FocusStatusRequest: focusStatus = CameraHalEvent::FOCUS_STATUS_PENDING; break; case OMX_FocusStatusReached: case OMX_FocusStatusOff: case OMX_FocusStatusUnableToReach: default: focusStatus = CameraHalEvent::FOCUS_STATUS_DONE; break; } notifyFocusSubscribers(focusStatus); }
status_t SensorListener::initialize() { status_t ret = NO_ERROR; SensorManager& mgr(SensorManager::getInstance()); LOG_FUNCTION_NAME; sp<Looper> mLooper; mSensorEventQueue = mgr.createEventQueue(); if (mSensorEventQueue == NULL) { CAMHAL_LOGEA("createEventQueue returned NULL"); ret = NO_INIT; goto out; } mLooper = new Looper(false); mLooper->addFd(mSensorEventQueue->getFd(), 0, ALOOPER_EVENT_INPUT, sensor_events_listener, this); if (mSensorLooperThread.get() == NULL) mSensorLooperThread = new SensorLooperThread(mLooper.get()); if (mSensorLooperThread.get() == NULL) { CAMHAL_LOGEA("Couldn't create sensor looper thread"); ret = NO_MEMORY; goto out; } ret = mSensorLooperThread->run("sensor looper thread", PRIORITY_URGENT_DISPLAY); if (ret == INVALID_OPERATION){ CAMHAL_LOGDA("thread already running ?!?"); } else if (ret != NO_ERROR) { CAMHAL_LOGEA("couldn't run thread"); goto out; } out: LOG_FUNCTION_NAME_EXIT; return ret; }
status_t OMXCameraAdapter::doAutoFocus() { status_t ret = NO_ERROR; OMX_ERRORTYPE eError = OMX_ErrorNone; OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl; OMX_PARAM_FOCUSSTATUSTYPE focusStatus; OMX_CONFIG_BOOLEANTYPE bOMX; nsecs_t timeout = 0; LOG_FUNCTION_NAME; if ( OMX_StateInvalid == mComponentState ) { CAMHAL_LOGEA("OMX component in Invalid state"); returnFocusStatus(false); return -EINVAL; } if ( OMX_StateExecuting != mComponentState ) { CAMHAL_LOGEA("OMX component not in executing state"); returnFocusStatus(false); return NO_ERROR; } if( ((AF_ACTIVE & getState()) != AF_ACTIVE) && ((AF_ACTIVE & getNextState()) != AF_ACTIVE) ) { CAMHAL_LOGDA("Auto focus got canceled before doAutoFocus could be called"); return NO_ERROR; } OMX_INIT_STRUCT_PTR (&focusStatus, OMX_PARAM_FOCUSSTATUSTYPE); // If the app calls autoFocus, the camera will stop sending face callbacks. pauseFaceDetection(true); // This is needed for applying FOCUS_REGION correctly if ( (!mFocusAreas.isEmpty()) && (!mFocusAreas.itemAt(0)->isZeroArea())) { //Disable face priority setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false); //Enable region algorithm priority setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, true); } OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) mParameters3A.Focus; if (mParameters3A.FocusLock) { // this basically means user never called cancelAutoFocus after a scan... // if this is the case we need to unlock AF to ensure we will do a scan if (set3ALock(mUserSetExpLock, mUserSetWbLock, OMX_FALSE) != NO_ERROR) { CAMHAL_LOGEA("Error Unlocking 3A locks"); } else { CAMHAL_LOGDA("AE/AWB unlocked successfully"); } } else if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) { // In case we have CAF running we should first check the AF status. // If it has managed to lock, then do as usual and return status // immediately. ret = checkFocus(&focusStatus); if ( NO_ERROR != ret ) { CAMHAL_LOGEB("Focus status check failed 0x%x!", ret); return ret; } else { CAMHAL_LOGDB("Focus status check 0x%x!", focusStatus.eFocusStatus); } } if ( (focusControl.eFocusControl == OMX_IMAGE_FocusControlAuto && ( focusStatus.eFocusStatus == OMX_FocusStatusRequest || focusStatus.eFocusStatus == OMX_FocusStatusUnableToReach || focusStatus.eFocusStatus == OMX_FocusStatusLost ) ) || (mParameters3A.Focus != (OMX_IMAGE_FOCUSCONTROLTYPE)OMX_IMAGE_FocusControlAuto) ) { OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE); bOMX.bEnabled = OMX_TRUE; //Enable focus scanning eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, (OMX_INDEXTYPE)OMX_TI_IndexConfigAutofocusEnable, &bOMX); // force AF, Ducati will take care of whether CAF // or AF will be performed, depending on light conditions if ( focusControl.eFocusControl == OMX_IMAGE_FocusControlAuto && ( focusStatus.eFocusStatus == OMX_FocusStatusUnableToReach || focusStatus.eFocusStatus == OMX_FocusStatusLost ) ) { focusControl.eFocusControl = OMX_IMAGE_FocusControlAutoLock; } if ( focusControl.eFocusControl != OMX_IMAGE_FocusControlAuto ) { eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, OMX_IndexConfigFocusControl, &focusControl); } if ( OMX_ErrorNone != eError ) { CAMHAL_LOGEB("Error while starting focus 0x%x", eError); return INVALID_OPERATION; } else { CAMHAL_LOGDA("Autofocus started successfully"); } // configure focus timeout based on capture mode timeout = (mCapMode == VIDEO_MODE) ? ( ( nsecs_t ) AF_VIDEO_CALLBACK_TIMEOUT * 1000 ) : ( ( nsecs_t ) AF_IMAGE_CALLBACK_TIMEOUT * 1000 ); { Mutex::Autolock lock(mDoAFMutex); ret = mDoAFCond.waitRelative(mDoAFMutex, timeout); } //If somethiing bad happened while we wait if (mComponentState == OMX_StateInvalid) { CAMHAL_LOGEA("Invalid State after Auto Focus Exitting!!!"); return -EINVAL; } if(ret != NO_ERROR) { CAMHAL_LOGEA("Autofocus callback timeout expired"); ret = returnFocusStatus(true); } else { ret = returnFocusStatus(false); } } else { // Focus mode in continuous if ( NO_ERROR == ret ) { ret = returnFocusStatus(true); mPending3Asettings |= SetFocus; } } LOG_FUNCTION_NAME_EXIT; return ret; }
status_t OMXCameraAdapter::returnFocusStatus(bool timeoutReached) { status_t ret = NO_ERROR; OMX_PARAM_FOCUSSTATUSTYPE eFocusStatus; CameraHalEvent::FocusStatus focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; BaseCameraAdapter::AdapterState state, nextState; BaseCameraAdapter::getState(state); BaseCameraAdapter::getNextState(nextState); LOG_FUNCTION_NAME; OMX_INIT_STRUCT(eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); if( ((AF_ACTIVE & state ) != AF_ACTIVE) && ((AF_ACTIVE & nextState ) != AF_ACTIVE) ) { /// We don't send focus callback if focus was not started CAMHAL_LOGDA("Not sending focus callback because focus was not started"); return NO_ERROR; } if ( NO_ERROR == ret ) { if ( !timeoutReached ) { ret = checkFocus(&eFocusStatus); if ( NO_ERROR != ret ) { CAMHAL_LOGEA("Focus status check failed!"); } } } if ( NO_ERROR == ret ) { if ( timeoutReached ) { focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; } else { switch (eFocusStatus.eFocusStatus) { case OMX_FocusStatusReached: { focusStatus = CameraHalEvent::FOCUS_STATUS_SUCCESS; break; } case OMX_FocusStatusOff: // AF got canceled return NO_ERROR; case OMX_FocusStatusUnableToReach: case OMX_FocusStatusRequest: default: { focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; break; } } // Lock CAF after AF call if( set3ALock(mUserSetExpLock, mUserSetWbLock, OMX_TRUE) != NO_ERROR) { CAMHAL_LOGEA("Error Applying 3A locks"); } else { CAMHAL_LOGDA("Focus locked. Applied focus locks successfully"); } stopAutoFocus(); } //Query current focus distance after AF is complete updateFocusDistances(mParameters); } ret = BaseCameraAdapter::setState(CAMERA_CANCEL_AUTOFOCUS); if ( NO_ERROR == ret ) { ret = BaseCameraAdapter::commitState(); } else { ret |= BaseCameraAdapter::rollbackState(); } if ( NO_ERROR == ret ) { notifyFocusSubscribers(focusStatus); } // After focus, face detection will resume sending face callbacks pauseFaceDetection(false); LOG_FUNCTION_NAME_EXIT; return ret; }