1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* 2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/ 3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License"); 5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License. 6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at 7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * http://www.apache.org/licenses/LICENSE-2.0 9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software 11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS, 12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and 14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License. 15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @file OMXFocus.cpp 20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This file contains functionality for handling focus configurations. 22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/ 24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#undef LOG_TAG 26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_TAG "CameraHAL" 28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h" 30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMXCameraAdapter.h" 3100479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman#include "ErrorUtils.h" 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define TOUCH_FOCUS_RANGE 0xFF 3405ea07dfe04d915b4288d3e71afbf70f8082fea4Tyler Luu#define AF_IMAGE_CALLBACK_TIMEOUT 5000000 //5 seconds timeout 3505ea07dfe04d915b4288d3e71afbf70f8082fea4Tyler Luu#define AF_VIDEO_CALLBACK_TIMEOUT 2800000 //2.8 seconds timeout 36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android { 38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setParametersFocus(const CameraParameters ¶ms, 40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BaseCameraAdapter::AdapterState state) 41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *str = NULL; 445458bdc45048501d1919b14d22456de91f7e8950Tyler Luu Vector< sp<CameraArea> > tempAreas; 45708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev size_t MAX_FOCUS_AREAS; 46708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 495458bdc45048501d1919b14d22456de91f7e8950Tyler Luu Mutex::Autolock lock(mFocusAreasLock); 505458bdc45048501d1919b14d22456de91f7e8950Tyler Luu 51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev str = params.get(CameraParameters::KEY_FOCUS_AREAS); 52708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 53708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev MAX_FOCUS_AREAS = atoi(params.get(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS)); 54708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 559e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu if ( NULL != str ) { 565458bdc45048501d1919b14d22456de91f7e8950Tyler Luu ret = CameraArea::parseAreas(str, ( strlen(str) + 1 ), tempAreas); 579e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu } 589e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu 595458bdc45048501d1919b14d22456de91f7e8950Tyler Luu if ( (NO_ERROR == ret) && CameraArea::areAreasDifferent(mFocusAreas, tempAreas) ) { 605458bdc45048501d1919b14d22456de91f7e8950Tyler Luu mFocusAreas.clear(); 615458bdc45048501d1919b14d22456de91f7e8950Tyler Luu mFocusAreas = tempAreas; 629e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu if ( MAX_FOCUS_AREAS < mFocusAreas.size() ) { 639e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu CAMHAL_LOGEB("Focus areas supported %d, focus areas set %d", 649e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu MAX_FOCUS_AREAS, 659e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu mFocusAreas.size()); 669e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu ret = -EINVAL; 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 68f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov else { 69f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov if ( !mFocusAreas.isEmpty() ) { 70f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov setTouchFocus(); 71f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov } 72f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov } 739e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu } 74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::doAutoFocus() 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl; 8585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_PARAM_FOCUSSTATUSTYPE focusStatus; 862136042f80a20aeeef3ece24bab027c401426334Milen Mitkov OMX_CONFIG_BOOLEANTYPE bOMX; 87ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev nsecs_t timeout = 0; 88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 91b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng if ( OMX_StateInvalid == mComponentState ) 92b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng { 93b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng CAMHAL_LOGEA("OMX component in Invalid state"); 94b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng returnFocusStatus(false); 95b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng return -EINVAL; 96b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng } 97b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev returnFocusStatus(false); 102b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng return NO_ERROR; 103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 106030e1a5962195aa5914e76e3d071669869555a9fTyler Luu if( ((AF_ACTIVE & getState()) != AF_ACTIVE) && ((AF_ACTIVE & getNextState()) != AF_ACTIVE) ) { 107030e1a5962195aa5914e76e3d071669869555a9fTyler Luu CAMHAL_LOGDA("Auto focus got canceled before doAutoFocus could be called"); 108030e1a5962195aa5914e76e3d071669869555a9fTyler Luu return NO_ERROR; 109030e1a5962195aa5914e76e3d071669869555a9fTyler Luu } 110030e1a5962195aa5914e76e3d071669869555a9fTyler Luu 11196f2b555d2200fca7d8399c4c9a968590637aa31Emilian Peev OMX_INIT_STRUCT_PTR (&focusStatus, OMX_PARAM_FOCUSSTATUSTYPE); 11296f2b555d2200fca7d8399c4c9a968590637aa31Emilian Peev 113aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // If the app calls autoFocus, the camera will stop sending face callbacks. 114aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(true); 115aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 116f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov // This is needed for applying FOCUS_REGION correctly 117f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov if ( (!mFocusAreas.isEmpty()) && (!mFocusAreas.itemAt(0)->isZeroArea())) 118f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov { 119f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov //Disable face priority 120f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false); 121f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov 122f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov //Enable region algorithm priority 123f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, true); 124f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov } 125f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov 12685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 12785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) mParameters3A.Focus; 12885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 1290e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu if (mParameters3A.FocusLock) { 1300e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // this basically means user never called cancelAutoFocus after a scan... 1310e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // if this is the case we need to unlock AF to ensure we will do a scan 1320e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu if (set3ALock(mUserSetExpLock, mUserSetWbLock, OMX_FALSE) != NO_ERROR) { 1330e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu CAMHAL_LOGEA("Error Unlocking 3A locks"); 1340e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } else { 1350e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu CAMHAL_LOGDA("AE/AWB unlocked successfully"); 1360e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } 137f5f41aa7943adde4e7bfb3fc181de154c4b0b9b0Sundar Raman 1380e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } else if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) { 1390e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // In case we have CAF running we should first check the AF status. 1400e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // If it has managed to lock, then do as usual and return status 141057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu // immediately. 14285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ret = checkFocus(&focusStatus); 14385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( NO_ERROR != ret ) { 14485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGEB("Focus status check failed 0x%x!", ret); 14585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return ret; 14685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } else { 14785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGDB("Focus status check 0x%x!", focusStatus.eFocusStatus); 14885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 14985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 151d8bf3dc07ef357eb0761cfdacab458f2358907aaEmilian Peev if ( (focusControl.eFocusControl == OMX_IMAGE_FocusControlAuto && 152d8bf3dc07ef357eb0761cfdacab458f2358907aaEmilian Peev ( focusStatus.eFocusStatus == OMX_FocusStatusRequest || 153d8bf3dc07ef357eb0761cfdacab458f2358907aaEmilian Peev focusStatus.eFocusStatus == OMX_FocusStatusUnableToReach || 154d8bf3dc07ef357eb0761cfdacab458f2358907aaEmilian Peev focusStatus.eFocusStatus == OMX_FocusStatusLost ) ) || 1553c272a993dfc4ca153b09e5ec1e651f75eab90c4Milen Mitkov (mParameters3A.Focus != (OMX_IMAGE_FOCUSCONTROLTYPE)OMX_IMAGE_FocusControlAuto) ) 1563c272a993dfc4ca153b09e5ec1e651f75eab90c4Milen Mitkov { 1572136042f80a20aeeef3ece24bab027c401426334Milen Mitkov OMX_INIT_STRUCT_PTR (&bOMX, OMX_CONFIG_BOOLEANTYPE); 1582136042f80a20aeeef3ece24bab027c401426334Milen Mitkov bOMX.bEnabled = OMX_TRUE; 1592136042f80a20aeeef3ece24bab027c401426334Milen Mitkov 1602136042f80a20aeeef3ece24bab027c401426334Milen Mitkov //Enable focus scanning 1612136042f80a20aeeef3ece24bab027c401426334Milen Mitkov eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 1622136042f80a20aeeef3ece24bab027c401426334Milen Mitkov (OMX_INDEXTYPE)OMX_TI_IndexConfigAutofocusEnable, 1632136042f80a20aeeef3ece24bab027c401426334Milen Mitkov &bOMX); 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 165b92d77425f939a35c0404a5317c3dcd6c2008ecbMilen Mitkov // force AF, Ducati will take care of whether CAF 166b92d77425f939a35c0404a5317c3dcd6c2008ecbMilen Mitkov // or AF will be performed, depending on light conditions 167d8bf3dc07ef357eb0761cfdacab458f2358907aaEmilian Peev if ( focusControl.eFocusControl == OMX_IMAGE_FocusControlAuto && 168d8bf3dc07ef357eb0761cfdacab458f2358907aaEmilian Peev ( focusStatus.eFocusStatus == OMX_FocusStatusUnableToReach || 169d8bf3dc07ef357eb0761cfdacab458f2358907aaEmilian Peev focusStatus.eFocusStatus == OMX_FocusStatusLost ) ) { 170d8bf3dc07ef357eb0761cfdacab458f2358907aaEmilian Peev focusControl.eFocusControl = OMX_IMAGE_FocusControlAutoLock; 171d8bf3dc07ef357eb0761cfdacab458f2358907aaEmilian Peev } 172b92d77425f939a35c0404a5317c3dcd6c2008ecbMilen Mitkov 1733c272a993dfc4ca153b09e5ec1e651f75eab90c4Milen Mitkov if ( focusControl.eFocusControl != OMX_IMAGE_FocusControlAuto ) 1743c272a993dfc4ca153b09e5ec1e651f75eab90c4Milen Mitkov { 1753c272a993dfc4ca153b09e5ec1e651f75eab90c4Milen Mitkov eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 1763c272a993dfc4ca153b09e5ec1e651f75eab90c4Milen Mitkov OMX_IndexConfigFocusControl, 1773c272a993dfc4ca153b09e5ec1e651f75eab90c4Milen Mitkov &focusControl); 178b96dffd40e25d29a61f9fbd7f2e5968b5335b957Emilian Peev } 1796b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng 180707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala if ( OMX_ErrorNone != eError ) { 181707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala CAMHAL_LOGEB("Error while starting focus 0x%x", eError); 182707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala return INVALID_OPERATION; 183707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala } else { 184707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala CAMHAL_LOGDA("Autofocus started successfully"); 185707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala } 186707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala 187707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala // configure focus timeout based on capture mode 188707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala timeout = (mCapMode == VIDEO_MODE) ? 189ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev ( ( nsecs_t ) AF_VIDEO_CALLBACK_TIMEOUT * 1000 ) : 190ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev ( ( nsecs_t ) AF_IMAGE_CALLBACK_TIMEOUT * 1000 ); 191ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev 192707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala { 193707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala Mutex::Autolock lock(mDoAFMutex); 194ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev ret = mDoAFCond.waitRelative(mDoAFMutex, timeout); 195ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev } 19605ea07dfe04d915b4288d3e71afbf70f8082fea4Tyler Luu 1977a1746145a89cca0dafe26478a7675c15d5623a3Akwasi Boateng //If somethiing bad happened while we wait 1987a1746145a89cca0dafe26478a7675c15d5623a3Akwasi Boateng if (mComponentState == OMX_StateInvalid) { 1997a1746145a89cca0dafe26478a7675c15d5623a3Akwasi Boateng CAMHAL_LOGEA("Invalid State after Auto Focus Exitting!!!"); 200057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu return -EINVAL; 2017a1746145a89cca0dafe26478a7675c15d5623a3Akwasi Boateng } 2026b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng 203057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu if(ret != NO_ERROR) { 2047a1746145a89cca0dafe26478a7675c15d5623a3Akwasi Boateng CAMHAL_LOGEA("Autofocus callback timeout expired"); 205057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu ret = returnFocusStatus(true); 20685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } else { 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = returnFocusStatus(false); 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2090e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } else { // Focus mode in continuous 21085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( NO_ERROR == ret ) { 211ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev ret = returnFocusStatus(true); 212f50bf42f39a1d1ca8505d198b41c557e8ca83668Heechan Park mPending3Asettings |= SetFocus; 213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 21485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 21585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopAutoFocus() 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl; 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 228b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng if ( OMX_StateInvalid == mComponentState ) 229b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng { 230b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng CAMHAL_LOGEA("OMX component in Invalid state"); 231b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng returnFocusStatus(false); 232b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng return -EINVAL; 233b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng } 234b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng 235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 237b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng CAMHAL_LOGEA("OMX component not in executing state"); 238b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng return NO_ERROR; 239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAutoInfinity ) { 242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // No need to stop focus if we are in infinity mode. Nothing to stop. 243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2465703f6d63cead1c511f23531cfb13c5ba6de576bEmilian Peev OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 2475703f6d63cead1c511f23531cfb13c5ba6de576bEmilian Peev focusControl.eFocusControl = OMX_IMAGE_FocusControlOff; 2485703f6d63cead1c511f23531cfb13c5ba6de576bEmilian Peev 2495703f6d63cead1c511f23531cfb13c5ba6de576bEmilian Peev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 2505703f6d63cead1c511f23531cfb13c5ba6de576bEmilian Peev OMX_IndexConfigFocusControl, 2515703f6d63cead1c511f23531cfb13c5ba6de576bEmilian Peev &focusControl); 2525703f6d63cead1c511f23531cfb13c5ba6de576bEmilian Peev if ( OMX_ErrorNone != eError ) 253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2545703f6d63cead1c511f23531cfb13c5ba6de576bEmilian Peev CAMHAL_LOGEB("Error while stopping focus 0x%x", eError); 2555703f6d63cead1c511f23531cfb13c5ba6de576bEmilian Peev return ErrorUtils::omxToAndroidError(eError); 256707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala } else { 257707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala // This is a WA. Usually the OMX Camera component should 258707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala // generate AF status change OMX event fairly quickly 259707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala // ( after one preview frame ) and this notification should 260707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala // actually come from 'handleFocusCallback()'. 261707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala Mutex::Autolock lock(mDoAFMutex); 262707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala mDoAFCond.broadcast(); 2635703f6d63cead1c511f23531cfb13c5ba6de576bEmilian Peev } 264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 265707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala 266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 268707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala return NO_ERROR; 269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 27185c859b69b3c003b8db810371e24fe41599fc7deSundar Ramanstatus_t OMXCameraAdapter::getFocusMode(OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE &focusMode) 27285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman{; 27385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_ERRORTYPE eError = OMX_ErrorNone; 27485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 27585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman LOG_FUNCTION_NAME; 27685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 27785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( OMX_StateInvalid == mComponentState ) { 27885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGEA("OMX component is in invalid state"); 27985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return NO_INIT; 28085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 28185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 28285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_INIT_STRUCT_PTR (&focusMode, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 28385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman focusMode.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 28485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 28585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 28685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IndexConfigFocusControl, 28785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman &focusMode); 28885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 28985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( OMX_ErrorNone != eError ) { 29085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGEB("Error while retrieving focus mode 0x%x", eError); 29185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 29285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 29385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman LOG_FUNCTION_NAME_EXIT; 29485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 29585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return ErrorUtils::omxToAndroidError(eError); 29685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman} 29785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::cancelAutoFocus() 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 30285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusMode; 303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 30685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ret = getFocusMode(focusMode); 30785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( NO_ERROR != ret ) { 30885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return ret; 30985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 31085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 3118cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //Stop the AF only for modes other than CAF or Inifinity 31285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( ( focusMode.eFocusControl != OMX_IMAGE_FocusControlAuto ) && 31385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ( focusMode.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE ) 314707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala OMX_IMAGE_FocusControlAutoInfinity ) ) { 3158cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman stopAutoFocus(); 3168a35a0ca4d30702b693c92f8cee360a8d102f49eTyler Luu } else if (focusMode.eFocusControl == OMX_IMAGE_FocusControlAuto) { 317796f0f82433a3040198f216d15fd9ce17c04f360Emilian Peev // This re-enabling of CAF doesn't seem to 318796f0f82433a3040198f216d15fd9ce17c04f360Emilian Peev // be needed any more. 3198a35a0ca4d30702b693c92f8cee360a8d102f49eTyler Luu // re-apply CAF after unlocking and canceling 320796f0f82433a3040198f216d15fd9ce17c04f360Emilian Peev // mPending3Asettings |= SetFocus; 32185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 322aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // If the apps call #cancelAutoFocus()}, the face callbacks will also resume. 323aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(false); 324aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setFocusCallback(bool enabled) 332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_CALLBACKREQUESTTYPE focusRequstCallback; 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 339b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng if ( OMX_StateInvalid == mComponentState ) 340b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng { 341b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng CAMHAL_LOGEA("OMX component in Invalid state"); 342b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng ret = -EINVAL; 343b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng } 344b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng 345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 347b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng CAMHAL_LOGEA("OMX component not in executing state"); 348b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng ret = NO_ERROR; 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&focusRequstCallback, OMX_CONFIG_CALLBACKREQUESTTYPE); 355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.nPortIndex = OMX_ALL; 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.nIndex = OMX_IndexConfigCommonFocusStatus; 357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( enabled ) 359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.bEnable = OMX_TRUE; 361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.bEnable = OMX_FALSE; 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_INDEXTYPE) OMX_IndexConfigCallbackRequest, 369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusRequstCallback); 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error registering focus callback 0x%x", eError); 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Autofocus callback for index 0x%x registered successfully", 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus); 379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::returnFocusStatus(bool timeoutReached) 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_PARAM_FOCUSSTATUSTYPE eFocusStatus; 391057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu CameraHalEvent::FocusStatus focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; 392bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu BaseCameraAdapter::AdapterState state, nextState; 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BaseCameraAdapter::getState(state); 394bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu BaseCameraAdapter::getNextState(nextState); 395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT(eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); 399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 400bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu if( ((AF_ACTIVE & state ) != AF_ACTIVE) && ((AF_ACTIVE & nextState ) != AF_ACTIVE) ) 401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// We don't send focus callback if focus was not started 403bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu CAMHAL_LOGDA("Not sending focus callback because focus was not started"); 404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !timeoutReached ) 411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = checkFocus(&eFocusStatus); 413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Focus status check failed!"); 417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( timeoutReached ) 425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 426057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; 427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch (eFocusStatus.eFocusStatus) 431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusReached: 433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 434057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu focusStatus = CameraHalEvent::FOCUS_STATUS_SUCCESS; 435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 437ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev case OMX_FocusStatusOff: // AF got canceled 438ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev return NO_ERROR; 439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusUnableToReach: 440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusRequest: 441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 443057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; 444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4470e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // Lock CAF after AF call 4480e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu if( set3ALock(mUserSetExpLock, mUserSetWbLock, OMX_TRUE) != NO_ERROR) { 4497d56715ab78f6b4be347597dc439d598cfe47dc9Sundar Raman CAMHAL_LOGEA("Error Applying 3A locks"); 4500e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } else { 4517d56715ab78f6b4be347597dc439d598cfe47dc9Sundar Raman CAMHAL_LOGDA("Focus locked. Applied focus locks successfully"); 4520e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } 453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev stopAutoFocus(); 454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 455ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev 456fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu //Query current focus distance after AF is complete 457fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu updateFocusDistances(mParameters); 458fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu } 459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4608cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret = BaseCameraAdapter::setState(CAMERA_CANCEL_AUTOFOCUS); 461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4638cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret = BaseCameraAdapter::commitState(); 4648cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman } 4658cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman else 4668cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman { 4678cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret |= BaseCameraAdapter::rollbackState(); 468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev notifyFocusSubscribers(focusStatus); 473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 475aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // After focus, face detection will resume sending face callbacks 476aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(false); 477aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::checkFocus(OMX_PARAM_FOCUSSTATUSTYPE *eFocusStatus) 484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == eFocusStatus ) 491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid focus status"); 493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 496b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng if ( OMX_StateInvalid == mComponentState ) 497b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng { 498b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng CAMHAL_LOGEA("OMX component in Invalid state"); 499b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng ret = -EINVAL; 500b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng } 501b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng 502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 505b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng ret = NO_ERROR; 506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); 511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus, 513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eFocusStatus); 514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while retrieving focus status: 0x%x", eError); 517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Focus Status: %d", eFocusStatus->eFocusStatus); 524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::updateFocusDistances(CameraParameters ¶ms) 532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 focusNear, focusOptimal, focusFar; 534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = getFocusDistances(focusNear, focusOptimal, focusFar); 539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret) 540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = addFocusDistances(focusNear, focusOptimal, focusFar, params); 542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error in call to addFocusDistances() 0x%x", ret); 545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error in call to getFocusDistances() 0x%x", ret); 550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::getFocusDistances(OMX_U32 &near,OMX_U32 &optimal, OMX_U32 &far) 558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError; 561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_TI_CONFIG_FOCUSDISTANCETYPE focusDist; 563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = UNKNOWN_ERROR; 570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR(&focusDist, OMX_TI_CONFIG_FOCUSDISTANCETYPE); 575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusDist.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_TI_IndexConfigFocusDistance, 579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusDist); 580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while querying focus distances 0x%x", eError); 583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = UNKNOWN_ERROR; 584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev near = focusDist.nFocusDistanceNear; 591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev optimal = focusDist.nFocusDistanceOptimal; 592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev far = focusDist.nFocusDistanceFar; 593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::encodeFocusDistance(OMX_U32 dist, char *buffer, size_t length) 601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t focusScale = 1000; 604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev float distFinal; 605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mParameters3A.Focus == OMX_IMAGE_FocusControlAutoInfinity) 609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev dist=0; 611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( 0 == dist ) 616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strncpy(buffer, CameraParameters::FOCUS_DISTANCE_INFINITY, ( length - 1 )); 618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev distFinal = dist; 622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev distFinal /= focusScale; 623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev snprintf(buffer, ( length - 1 ) , "%5.3f", distFinal); 624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::addFocusDistances(OMX_U32 &near, 633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 &optimal, 634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 &far, 635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraParameters& params) 636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(near, mFocusDistNear, FOCUS_DIST_SIZE); 644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(optimal, mFocusDistOptimal, FOCUS_DIST_SIZE); 653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(far, mFocusDistFar, FOCUS_DIST_SIZE); 662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev snprintf(mFocusDistBuffer, ( FOCUS_DIST_BUFFER_SIZE - 1) ,"%s,%s,%s", mFocusDistNear, 671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFocusDistOptimal, 672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFocusDistFar); 673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev params.set(CameraParameters::KEY_FOCUS_DISTANCES, mFocusDistBuffer); 675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 682708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchevstatus_t OMXCameraAdapter::setTouchFocus() 683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 686708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 687708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_ALGOAREASTYPE **focusAreas; 688708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_TI_CONFIG_SHAREDBUFFER sharedBuffer; 689708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev MemoryManager memMgr; 690708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev int areasSize = 0; 691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 703708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev areasSize = ((sizeof(OMX_ALGOAREASTYPE)+4095)/4096)*4096; 704708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas = (OMX_ALGOAREASTYPE**) memMgr.allocateBuffer(0, 0, NULL, areasSize, 1); 705708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 706708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMXCameraPortParameters * mPreviewData = NULL; 707708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex]; 708708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 709708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if (!focusAreas) 710708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 711708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGEB("Error allocating buffer for focus areas %d", eError); 712708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev return -ENOMEM; 713708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 714708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 715708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_INIT_STRUCT_PTR (focusAreas[0], OMX_ALGOAREASTYPE); 716708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 717708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nPortIndex = OMX_ALL; 718708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nNumAreas = mFocusAreas.size(); 719708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nAlgoAreaPurpose = OMX_AlgoAreaFocus; 720708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 721708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // If the area is the special case of (0, 0, 0, 0, 0), then 722708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // the algorithm needs nNumAreas to be set to 0, 723708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // in order to automatically choose the best fitting areas. 724708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if ( mFocusAreas.itemAt(0)->isZeroArea() ) 725708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 726708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nNumAreas = 0; 727708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 728708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 729708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev for ( unsigned int n = 0; n < mFocusAreas.size(); n++) 730708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 731708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // transform the coordinates to 3A-type coordinates 732708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev mFocusAreas.itemAt(n)->transfrom((size_t)mPreviewData->mWidth, 733708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t)mPreviewData->mHeight, 734708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nTop, 735708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nLeft, 736708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nWidth, 737708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nHeight); 738708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 739708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nLeft = 740708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nLeft * TOUCH_FOCUS_RANGE ) / mPreviewData->mWidth; 741708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nTop = 742708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nTop* TOUCH_FOCUS_RANGE ) / mPreviewData->mHeight; 743708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nWidth = 744708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nWidth * TOUCH_FOCUS_RANGE ) / mPreviewData->mWidth; 745708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nHeight = 746708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nHeight * TOUCH_FOCUS_RANGE ) / mPreviewData->mHeight; 747708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nPriority = mFocusAreas.itemAt(n)->getWeight(); 748708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 749708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGDB("Focus area %d : top = %d left = %d width = %d height = %d prio = %d", 750708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev n, (int)focusAreas[0]->tAlgoAreas[n].nTop, (int)focusAreas[0]->tAlgoAreas[n].nLeft, 751708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (int)focusAreas[0]->tAlgoAreas[n].nWidth, (int)focusAreas[0]->tAlgoAreas[n].nHeight, 752708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (int)focusAreas[0]->tAlgoAreas[n].nPriority); 753708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 754708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 755708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_INIT_STRUCT_PTR (&sharedBuffer, OMX_TI_CONFIG_SHAREDBUFFER); 756708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 757708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev sharedBuffer.nPortIndex = OMX_ALL; 758708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev sharedBuffer.nSharedBuffSize = areasSize; 759708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev sharedBuffer.pSharedBuff = (OMX_U8 *) focusAreas[0]; 760708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 761708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if ( NULL == sharedBuffer.pSharedBuff ) 762708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 763708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGEA("No resources to allocate OMX shared buffer"); 764708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ret = -ENOMEM; 765708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev goto EXIT; 766708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 767708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 768708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 769708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (OMX_INDEXTYPE) OMX_TI_IndexConfigAlgoAreas, &sharedBuffer); 770708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 773708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGEB("Error while setting Focus Areas configuration 0x%x", eError); 774708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ret = -EINVAL; 775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 776708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 777708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev EXIT: 778708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if (NULL != focusAreas) 779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 780708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev memMgr.freeBuffer((void*) focusAreas); 781708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas = NULL; 782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 790057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luuvoid OMXCameraAdapter::handleFocusCallback() { 791057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu OMX_PARAM_FOCUSSTATUSTYPE eFocusStatus; 792057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu CameraHalEvent::FocusStatus focusStatus = CameraHalEvent::FOCUS_STATUS_FAIL; 793057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu status_t ret = NO_ERROR; 794057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu BaseCameraAdapter::AdapterState nextState; 795057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu BaseCameraAdapter::getNextState(nextState); 796057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu 797057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu OMX_INIT_STRUCT(eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); 798057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu 799057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu ret = checkFocus(&eFocusStatus); 800057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu 801057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu if (NO_ERROR != ret) { 802057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu CAMHAL_LOGEA("Focus status check failed!"); 803057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu // signal and unblock doAutoFocus 804057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu if (AF_ACTIVE & nextState) { 805ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev Mutex::Autolock lock(mDoAFMutex); 806ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev mDoAFCond.broadcast(); 807057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu } 808057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu return; 809ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev } 810ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev 811707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala if ( ( eFocusStatus.eFocusStatus != OMX_FocusStatusRequest ) && 812707e301de8b52780a7f0e88e6f25ac919c23671fEino-Ville Talvala ( eFocusStatus.eFocusStatus != OMX_FocusStatusOff ) ) { 813057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu // signal doAutoFocus when a end of scan message comes 814057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu // ignore start of scan 815ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev Mutex::Autolock lock(mDoAFMutex); 816ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev mDoAFCond.broadcast(); 817ac0cf36b98237ec911f49e7b1b93ef6464666e48Emilian Peev } 818057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu 819057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu if (mParameters3A.Focus != (OMX_IMAGE_FOCUSCONTROLTYPE) OMX_IMAGE_FocusControlAuto) { 820057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu CAMHAL_LOGDA("unregistered focus callback when not in CAF or doAutoFocus... not handling"); 821057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu return; 822057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu } 823057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu 824057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu // Handling for CAF Callbacks 825057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu switch (eFocusStatus.eFocusStatus) { 826057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu case OMX_FocusStatusRequest: 827057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu focusStatus = CameraHalEvent::FOCUS_STATUS_PENDING; 828057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu break; 829057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu case OMX_FocusStatusReached: 830057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu case OMX_FocusStatusOff: 831057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu case OMX_FocusStatusUnableToReach: 832057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu default: 833057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu focusStatus = CameraHalEvent::FOCUS_STATUS_DONE; 834057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu break; 835057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu } 836057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu 837057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu notifyFocusSubscribers(focusStatus); 838057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu} 839057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu 840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 841