OMXFocus.cpp revision 8a35a0ca4d30702b693c92f8cee360a8d102f49e
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 349b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng#define AF_CALLBACK_TIMEOUT 5000000 //5 seconds timeout 35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android { 37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setParametersFocus(const CameraParameters ¶ms, 39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BaseCameraAdapter::AdapterState state) 40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *str = NULL; 435458bdc45048501d1919b14d22456de91f7e8950Tyler Luu Vector< sp<CameraArea> > tempAreas; 44708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev size_t MAX_FOCUS_AREAS; 45708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 485458bdc45048501d1919b14d22456de91f7e8950Tyler Luu Mutex::Autolock lock(mFocusAreasLock); 495458bdc45048501d1919b14d22456de91f7e8950Tyler Luu 50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev str = params.get(CameraParameters::KEY_FOCUS_AREAS); 51708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 52708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev MAX_FOCUS_AREAS = atoi(params.get(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS)); 53708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 549e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu if ( NULL != str ) { 555458bdc45048501d1919b14d22456de91f7e8950Tyler Luu ret = CameraArea::parseAreas(str, ( strlen(str) + 1 ), tempAreas); 569e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu } 579e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu 585458bdc45048501d1919b14d22456de91f7e8950Tyler Luu if ( (NO_ERROR == ret) && CameraArea::areAreasDifferent(mFocusAreas, tempAreas) ) { 595458bdc45048501d1919b14d22456de91f7e8950Tyler Luu mFocusAreas.clear(); 605458bdc45048501d1919b14d22456de91f7e8950Tyler Luu mFocusAreas = tempAreas; 619e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu if ( MAX_FOCUS_AREAS < mFocusAreas.size() ) { 629e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu CAMHAL_LOGEB("Focus areas supported %d, focus areas set %d", 639e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu MAX_FOCUS_AREAS, 649e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu mFocusAreas.size()); 659e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu ret = -EINVAL; 66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 67f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov else { 68f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov if ( !mFocusAreas.isEmpty() ) { 69f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov setTouchFocus(); 70f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov } 71f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov } 729e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu } 73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::doAutoFocus() 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl; 8485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_PARAM_FOCUSSTATUSTYPE focusStatus; 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev returnFocusStatus(false); 92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( 0 != mDoAFSem.Count() ) 96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error mDoAFSem semaphore count %d", mDoAFSem.Count()); 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 101aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // If the app calls autoFocus, the camera will stop sending face callbacks. 102aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(true); 103aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 104f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov // This is needed for applying FOCUS_REGION correctly 105f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov if ( (!mFocusAreas.isEmpty()) && (!mFocusAreas.itemAt(0)->isZeroArea())) 106f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov { 107f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov //Disable face priority 108f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false); 109f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov 110f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov //Enable region algorithm priority 111f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, true); 112f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov } 113f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov 11485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 11585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) mParameters3A.Focus; 11685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 1170e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu if (mParameters3A.FocusLock) { 1180e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // this basically means user never called cancelAutoFocus after a scan... 1190e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // if this is the case we need to unlock AF to ensure we will do a scan 1200e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu if (set3ALock(mUserSetExpLock, mUserSetWbLock, OMX_FALSE) != NO_ERROR) { 1210e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu CAMHAL_LOGEA("Error Unlocking 3A locks"); 1220e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } else { 1230e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu CAMHAL_LOGDA("AE/AWB unlocked successfully"); 1240e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } 125f5f41aa7943adde4e7bfb3fc181de154c4b0b9b0Sundar Raman 1260e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } else if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) { 1270e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // In case we have CAF running we should first check the AF status. 1280e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // If it has managed to lock, then do as usual and return status 1290e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // immediately. If lock is not available, then switch temporarily 1300e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // to 'autolock' and do normal AF. 13185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ret = checkFocus(&focusStatus); 13285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( NO_ERROR != ret ) { 13385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGEB("Focus status check failed 0x%x!", ret); 13485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return ret; 13585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } else { 13685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGDB("Focus status check 0x%x!", focusStatus.eFocusStatus); 13785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 13885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 14085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( ( focusControl.eFocusControl != OMX_IMAGE_FocusControlAuto ) && 14185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ( focusControl.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE ) 14285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IMAGE_FocusControlAutoInfinity ) ) { 143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 14485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp, 14585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, 14685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_ALL, 14785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IndexConfigCommonFocusStatus, 14885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman mDoAFSem); 1498cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman 15085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( NO_ERROR == ret ) { 15185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ret = setFocusCallback(true); 15285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1540e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 1550e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu OMX_IndexConfigFocusControl, 1560e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu &focusControl); 1576b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng 1580e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu if ( OMX_ErrorNone != eError ) { 1590e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu CAMHAL_LOGEB("Error while starting focus 0x%x", eError); 1600e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu return INVALID_OPERATION; 1610e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } else { 1620e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu CAMHAL_LOGDA("Autofocus started successfully"); 1630e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } 1646b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng 1650e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu if(mDoAFSem.WaitTimeout(AF_CALLBACK_TIMEOUT) != NO_ERROR) { 1660e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu //If somethiing bad happened while we wait 1670e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu if (mComponentState == OMX_StateInvalid) { 1680e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu CAMHAL_LOGEA("Invalid State after Auto Focus Exitting!!!"); 1690e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu return EINVAL; 1700e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } 1716b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng 1720e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu //Disable auto focus callback from Ducati 1739b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng setFocusCallback(false); 174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Autofocus callback timeout expired"); 1759b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng RemoveEvent(mCameraAdapterParameters.mHandleComp, 176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, 177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ALL, 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus, 179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NULL ); 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev returnFocusStatus(true); 18185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } else { 182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Autofocus callback received"); 1839b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng //Disable auto focus callback from Ducati 1849b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng setFocusCallback(false); 185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = returnFocusStatus(false); 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1870e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } else { // Focus mode in continuous 18885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( NO_ERROR == ret ) { 189e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman ret = returnFocusStatus(false); 190f50bf42f39a1d1ca8505d198b41c557e8ca83668Heechan Park mPending3Asettings |= SetFocus; 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 19285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 19385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopAutoFocus() 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl; 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAutoInfinity ) { 214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // No need to stop focus if we are in infinity mode. Nothing to stop. 215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Disable the callback first 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = setFocusCallback(false); 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusControl.eFocusControl = OMX_IMAGE_FocusControlOff; 228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigFocusControl, 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusControl); 232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while stopping focus 0x%x", eError); 23500479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman return ErrorUtils::omxToAndroidError(eError); 236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Query current focus distance after AF is complete 240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev updateFocusDistances(mParameters); 241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 24785c859b69b3c003b8db810371e24fe41599fc7deSundar Ramanstatus_t OMXCameraAdapter::getFocusMode(OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE &focusMode) 24885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman{; 24985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_ERRORTYPE eError = OMX_ErrorNone; 25085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 25185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman LOG_FUNCTION_NAME; 25285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 25385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( OMX_StateInvalid == mComponentState ) { 25485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGEA("OMX component is in invalid state"); 25585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return NO_INIT; 25685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 25785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 25885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_INIT_STRUCT_PTR (&focusMode, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 25985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman focusMode.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 26085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 26185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 26285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IndexConfigFocusControl, 26385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman &focusMode); 26485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 26585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( OMX_ErrorNone != eError ) { 26685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGEB("Error while retrieving focus mode 0x%x", eError); 26785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 26885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 26985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman LOG_FUNCTION_NAME_EXIT; 27085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 27185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return ErrorUtils::omxToAndroidError(eError); 27285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman} 27385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::cancelAutoFocus() 275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 27885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusMode; 279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 281ba027fc89ec3950e1ac2f95fcc3f1002442ddabbSundar Raman // Unlock 3A locks since they were locked by AF conditionally 2829dc08c5fb736308cfca6659f66b14165b265baebTyler Luu if( set3ALock(mUserSetExpLock, mUserSetWbLock, OMX_FALSE) != NO_ERROR) { 283c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu CAMHAL_LOGEA("Error Unlocking 3A locks"); 284c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu } 285c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu else{ 286c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu CAMHAL_LOGDA("AE/AWB unlocked successfully"); 287c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu } 288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 28985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ret = getFocusMode(focusMode); 29085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( NO_ERROR != ret ) { 29185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return ret; 29285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 29385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 2948cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //Stop the AF only for modes other than CAF or Inifinity 29585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( ( focusMode.eFocusControl != OMX_IMAGE_FocusControlAuto ) && 29685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ( focusMode.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE ) 29785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IMAGE_FocusControlAutoInfinity ) ) { 2988cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman stopAutoFocus(); 2998cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //Signal a dummy AF event so that in case the callback from ducati 3008cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //does come then it doesnt crash after 3018cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //exiting this function since eventSem will go out of scope. 3028cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret |= SignalEvent(mCameraAdapterParameters.mHandleComp, 3038cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, 3048cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman OMX_ALL, 3058cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman OMX_IndexConfigCommonFocusStatus, 3068cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman NULL ); 3078a35a0ca4d30702b693c92f8cee360a8d102f49eTyler Luu } else if (focusMode.eFocusControl == OMX_IMAGE_FocusControlAuto) { 3088a35a0ca4d30702b693c92f8cee360a8d102f49eTyler Luu // re-apply CAF after unlocking and canceling 3098a35a0ca4d30702b693c92f8cee360a8d102f49eTyler Luu mPending3Asettings |= SetFocus; 31085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 312aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // If the apps call #cancelAutoFocus()}, the face callbacks will also resume. 313aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(false); 314aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setFocusCallback(bool enabled) 322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_CALLBACKREQUESTTYPE focusRequstCallback; 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&focusRequstCallback, OMX_CONFIG_CALLBACKREQUESTTYPE); 339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.nPortIndex = OMX_ALL; 340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.nIndex = OMX_IndexConfigCommonFocusStatus; 341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( enabled ) 343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.bEnable = OMX_TRUE; 345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.bEnable = OMX_FALSE; 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_INDEXTYPE) OMX_IndexConfigCallbackRequest, 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusRequstCallback); 354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error registering focus callback 0x%x", eError); 357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Autofocus callback for index 0x%x registered successfully", 362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus); 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::returnFocusStatus(bool timeoutReached) 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_PARAM_FOCUSSTATUSTYPE eFocusStatus; 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool focusStatus = false; 376bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu BaseCameraAdapter::AdapterState state, nextState; 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BaseCameraAdapter::getState(state); 378bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu BaseCameraAdapter::getNextState(nextState); 379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT(eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 384bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu if( ((AF_ACTIVE & state ) != AF_ACTIVE) && ((AF_ACTIVE & nextState ) != AF_ACTIVE) ) 385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// We don't send focus callback if focus was not started 387bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu CAMHAL_LOGDA("Not sending focus callback because focus was not started"); 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !timeoutReached ) 395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = checkFocus(&eFocusStatus); 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Focus status check failed!"); 401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( timeoutReached ) 409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusStatus = false; 411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch (eFocusStatus.eFocusStatus) 415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusReached: 417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusStatus = true; 419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusOff: 422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusUnableToReach: 423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusRequest: 424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusStatus = false; 427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4300e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu // Lock CAF after AF call 4310e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu if( set3ALock(mUserSetExpLock, mUserSetWbLock, OMX_TRUE) != NO_ERROR) { 4327d56715ab78f6b4be347597dc439d598cfe47dc9Sundar Raman CAMHAL_LOGEA("Error Applying 3A locks"); 4330e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } else { 4347d56715ab78f6b4be347597dc439d598cfe47dc9Sundar Raman CAMHAL_LOGDA("Focus locked. Applied focus locks successfully"); 4350e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu } 436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev stopAutoFocus(); 438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4418cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret = BaseCameraAdapter::setState(CAMERA_CANCEL_AUTOFOCUS); 442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4448cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret = BaseCameraAdapter::commitState(); 4458cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman } 4468cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman else 4478cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman { 4488cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret |= BaseCameraAdapter::rollbackState(); 449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev notifyFocusSubscribers(focusStatus); 454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 456aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // After focus, face detection will resume sending face callbacks 457aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(false); 458aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::checkFocus(OMX_PARAM_FOCUSSTATUSTYPE *eFocusStatus) 465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == eFocusStatus ) 472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid focus status"); 474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); 486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus, 489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eFocusStatus); 490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while retrieving focus status: 0x%x", eError); 493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Focus Status: %d", eFocusStatus->eFocusStatus); 500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::updateFocusDistances(CameraParameters ¶ms) 508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 focusNear, focusOptimal, focusFar; 510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = getFocusDistances(focusNear, focusOptimal, focusFar); 515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret) 516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = addFocusDistances(focusNear, focusOptimal, focusFar, params); 518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error in call to addFocusDistances() 0x%x", ret); 521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error in call to getFocusDistances() 0x%x", ret); 526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::getFocusDistances(OMX_U32 &near,OMX_U32 &optimal, OMX_U32 &far) 534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError; 537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_TI_CONFIG_FOCUSDISTANCETYPE focusDist; 539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = UNKNOWN_ERROR; 546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR(&focusDist, OMX_TI_CONFIG_FOCUSDISTANCETYPE); 551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusDist.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_TI_IndexConfigFocusDistance, 555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusDist); 556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while querying focus distances 0x%x", eError); 559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = UNKNOWN_ERROR; 560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev near = focusDist.nFocusDistanceNear; 567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev optimal = focusDist.nFocusDistanceOptimal; 568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev far = focusDist.nFocusDistanceFar; 569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::encodeFocusDistance(OMX_U32 dist, char *buffer, size_t length) 577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t focusScale = 1000; 580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev float distFinal; 581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mParameters3A.Focus == OMX_IMAGE_FocusControlAutoInfinity) 585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev dist=0; 587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( 0 == dist ) 592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strncpy(buffer, CameraParameters::FOCUS_DISTANCE_INFINITY, ( length - 1 )); 594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev distFinal = dist; 598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev distFinal /= focusScale; 599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev snprintf(buffer, ( length - 1 ) , "%5.3f", distFinal); 600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::addFocusDistances(OMX_U32 &near, 609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 &optimal, 610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 &far, 611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraParameters& params) 612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(near, mFocusDistNear, FOCUS_DIST_SIZE); 620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(optimal, mFocusDistOptimal, FOCUS_DIST_SIZE); 629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(far, mFocusDistFar, FOCUS_DIST_SIZE); 638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev snprintf(mFocusDistBuffer, ( FOCUS_DIST_BUFFER_SIZE - 1) ,"%s,%s,%s", mFocusDistNear, 647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFocusDistOptimal, 648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFocusDistFar); 649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev params.set(CameraParameters::KEY_FOCUS_DISTANCES, mFocusDistBuffer); 651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 658708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchevstatus_t OMXCameraAdapter::setTouchFocus() 659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 662708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 663708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_ALGOAREASTYPE **focusAreas; 664708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_TI_CONFIG_SHAREDBUFFER sharedBuffer; 665708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev MemoryManager memMgr; 666708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev int areasSize = 0; 667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 679708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev areasSize = ((sizeof(OMX_ALGOAREASTYPE)+4095)/4096)*4096; 680708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas = (OMX_ALGOAREASTYPE**) memMgr.allocateBuffer(0, 0, NULL, areasSize, 1); 681708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 682708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMXCameraPortParameters * mPreviewData = NULL; 683708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex]; 684708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 685708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if (!focusAreas) 686708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 687708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGEB("Error allocating buffer for focus areas %d", eError); 688708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev return -ENOMEM; 689708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 690708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 691708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_INIT_STRUCT_PTR (focusAreas[0], OMX_ALGOAREASTYPE); 692708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 693708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nPortIndex = OMX_ALL; 694708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nNumAreas = mFocusAreas.size(); 695708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nAlgoAreaPurpose = OMX_AlgoAreaFocus; 696708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 697708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // If the area is the special case of (0, 0, 0, 0, 0), then 698708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // the algorithm needs nNumAreas to be set to 0, 699708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // in order to automatically choose the best fitting areas. 700708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if ( mFocusAreas.itemAt(0)->isZeroArea() ) 701708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 702708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nNumAreas = 0; 703708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 704708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 705708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev for ( unsigned int n = 0; n < mFocusAreas.size(); n++) 706708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 707708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // transform the coordinates to 3A-type coordinates 708708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev mFocusAreas.itemAt(n)->transfrom((size_t)mPreviewData->mWidth, 709708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t)mPreviewData->mHeight, 710708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nTop, 711708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nLeft, 712708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nWidth, 713708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nHeight); 714708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 715708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nLeft = 716708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nLeft * TOUCH_FOCUS_RANGE ) / mPreviewData->mWidth; 717708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nTop = 718708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nTop* TOUCH_FOCUS_RANGE ) / mPreviewData->mHeight; 719708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nWidth = 720708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nWidth * TOUCH_FOCUS_RANGE ) / mPreviewData->mWidth; 721708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nHeight = 722708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nHeight * TOUCH_FOCUS_RANGE ) / mPreviewData->mHeight; 723708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nPriority = mFocusAreas.itemAt(n)->getWeight(); 724708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 725708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGDB("Focus area %d : top = %d left = %d width = %d height = %d prio = %d", 726708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev n, (int)focusAreas[0]->tAlgoAreas[n].nTop, (int)focusAreas[0]->tAlgoAreas[n].nLeft, 727708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (int)focusAreas[0]->tAlgoAreas[n].nWidth, (int)focusAreas[0]->tAlgoAreas[n].nHeight, 728708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (int)focusAreas[0]->tAlgoAreas[n].nPriority); 729708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 730708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 731708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_INIT_STRUCT_PTR (&sharedBuffer, OMX_TI_CONFIG_SHAREDBUFFER); 732708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 733708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev sharedBuffer.nPortIndex = OMX_ALL; 734708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev sharedBuffer.nSharedBuffSize = areasSize; 735708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev sharedBuffer.pSharedBuff = (OMX_U8 *) focusAreas[0]; 736708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 737708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if ( NULL == sharedBuffer.pSharedBuff ) 738708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 739708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGEA("No resources to allocate OMX shared buffer"); 740708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ret = -ENOMEM; 741708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev goto EXIT; 742708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 743708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 744708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 745708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (OMX_INDEXTYPE) OMX_TI_IndexConfigAlgoAreas, &sharedBuffer); 746708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 749708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGEB("Error while setting Focus Areas configuration 0x%x", eError); 750708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ret = -EINVAL; 751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 752708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 753708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev EXIT: 754708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if (NULL != focusAreas) 755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 756708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev memMgr.freeBuffer((void*) focusAreas); 757708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas = NULL; 758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 767