OMXFocus.cpp revision 708ed7306c85286aa50d05ba15e0c33106e52ed0
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 34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define AF_CALLBACK_TIMEOUT 10000000 //10 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; 43d55379a7e975f992db1d10bba425f456447d14a8Tyler Luu Mutex::Autolock lock(mFocusAreasLock); 44708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev size_t MAX_FOCUS_AREAS; 45708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev str = params.get(CameraParameters::KEY_FOCUS_AREAS); 50708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 51708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev MAX_FOCUS_AREAS = atoi(params.get(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS)); 52708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFocusAreas.clear(); 549e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu if ( NULL != str ) { 5597e6bcc45eb2161c10761abc4fbf12ce3e1d52c8Tyler Luu ret = CameraArea::parseFocusArea(str, ( strlen(str) + 1 ), mFocusAreas); 569e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu } 579e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu 589e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu if ( NO_ERROR == ret ) { 599e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu if ( MAX_FOCUS_AREAS < mFocusAreas.size() ) { 609e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu CAMHAL_LOGEB("Focus areas supported %d, focus areas set %d", 619e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu MAX_FOCUS_AREAS, 629e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu mFocusAreas.size()); 639e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu ret = -EINVAL; 64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 659e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu } 66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::doAutoFocus() 73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl; 7785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_PARAM_FOCUSSTATUSTYPE focusStatus; 78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev returnFocusStatus(false); 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( 0 != mDoAFSem.Count() ) 89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error mDoAFSem semaphore count %d", mDoAFSem.Count()); 91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 94aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // If the app calls autoFocus, the camera will stop sending face callbacks. 95aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(true); 96aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 9785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 9885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) mParameters3A.Focus; 9985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 10085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman //In case we have CAF running we should first check the AF status. 10185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman //If it has managed to lock, then do as usual and return status 10285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman //immediately. If lock is not available, then switch temporarily 10385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman //to 'autolock' and do normal AF. 10485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) { 10585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman//FIXME: The CAF seems to return focus failure all the time. 10685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman// Probably this is tuning related, disable this until the 10785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman// MMS IQ team fixes it 10885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman#if 0 10985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ret = checkFocus(&focusStatus); 11085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman#else 11185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ret = NO_ERROR; 11285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman focusStatus.eFocusStatus = OMX_FocusStatusReached; 11385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman#endif 11485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( NO_ERROR != ret ) { 11585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGEB("Focus status check failed 0x%x!", ret); 11685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return ret; 11785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } else { 11885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGDB("Focus status check 0x%x!", focusStatus.eFocusStatus); 11985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 12185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( OMX_FocusStatusReached != focusStatus.eFocusStatus ) { 12285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman focusControl.eFocusControl = OMX_IMAGE_FocusControlAutoLock; 12385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 12485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 12685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( ( focusControl.eFocusControl != OMX_IMAGE_FocusControlAuto ) && 12785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ( focusControl.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE ) 12885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IMAGE_FocusControlAutoInfinity ) ) { 129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 13085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp, 13185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, 13285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_ALL, 13385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IndexConfigCommonFocusStatus, 13485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman mDoAFSem); 1358cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman 13685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( NO_ERROR == ret ) { 13785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ret = setFocusCallback(true); 13885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 14085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 14285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 14385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IndexConfigFocusControl, 14485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman &focusControl); 145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 14685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( OMX_ErrorNone != eError ) { 14785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGEB("Error while starting focus 0x%x", eError); 14885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return INVALID_OPERATION; 14985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } else { 15085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGDA("Autofocus started successfully"); 15185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 15285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 15385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( ( focusControl.eFocusControl != OMX_IMAGE_FocusControlAuto ) && 15485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ( focusControl.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE ) 15585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IMAGE_FocusControlAutoInfinity ) ) { 156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mDoAFSem.WaitTimeout(AF_CALLBACK_TIMEOUT); 157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Disable auto focus callback from Ducati 158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev setFocusCallback(false); 159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Signal a dummy AF event so that in case the callback from ducati 160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //does come then it doesnt crash after 161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //exiting this function since eventSem will go out of scope. 16285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if(ret != NO_ERROR) { 163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Autofocus callback timeout expired"); 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev SignalEvent(mCameraAdapterParameters.mHandleComp, 165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, 166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ALL, 167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus, 168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NULL ); 169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev returnFocusStatus(true); 17085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } else { 171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Autofocus callback received"); 172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = returnFocusStatus(false); 173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 17485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 17585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } else { 17685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( NO_ERROR == ret ) { 177e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman ret = returnFocusStatus(false); 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 17985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 18085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 18185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman //Restore CAF if needed 18285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( ( mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) && 18385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ( focusControl.eFocusControl == OMX_IMAGE_FocusControlAutoLock ) ) { 18485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman mPending3Asettings |= SetFocus; 18585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopAutoFocus() 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl; 197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAutoInfinity ) { 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // No need to stop focus if we are in infinity mode. Nothing to stop. 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Disable the callback first 214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = setFocusCallback(false); 215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusControl.eFocusControl = OMX_IMAGE_FocusControlOff; 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigFocusControl, 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusControl); 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while stopping focus 0x%x", eError); 22800479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman return ErrorUtils::omxToAndroidError(eError); 229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Query current focus distance after AF is complete 233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev updateFocusDistances(mParameters); 234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 24085c859b69b3c003b8db810371e24fe41599fc7deSundar Ramanstatus_t OMXCameraAdapter::getFocusMode(OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE &focusMode) 24185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman{; 24285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_ERRORTYPE eError = OMX_ErrorNone; 24385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 24485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman LOG_FUNCTION_NAME; 24585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 24685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( OMX_StateInvalid == mComponentState ) { 24785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGEA("OMX component is in invalid state"); 24885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return NO_INIT; 24985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 25085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 25185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_INIT_STRUCT_PTR (&focusMode, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 25285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman focusMode.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 25385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 25485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 25585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IndexConfigFocusControl, 25685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman &focusMode); 25785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 25885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( OMX_ErrorNone != eError ) { 25985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman CAMHAL_LOGEB("Error while retrieving focus mode 0x%x", eError); 26085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 26185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 26285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman LOG_FUNCTION_NAME_EXIT; 26385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 26485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return ErrorUtils::omxToAndroidError(eError); 26585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman} 26685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::cancelAutoFocus() 268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 27185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusMode; 272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 274c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu // Unlock 3A locks since they were locked by AF 275c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu if( set3ALock(OMX_FALSE) != NO_ERROR) { 276c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu CAMHAL_LOGEA("Error Unlocking 3A locks"); 277c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu } 278c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu else{ 279c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu CAMHAL_LOGDA("AE/AWB unlocked successfully"); 280c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu } 281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 28285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ret = getFocusMode(focusMode); 28385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( NO_ERROR != ret ) { 28485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman return ret; 28585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 28685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman 2878cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //Stop the AF only for modes other than CAF or Inifinity 28885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman if ( ( focusMode.eFocusControl != OMX_IMAGE_FocusControlAuto ) && 28985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman ( focusMode.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE ) 29085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman OMX_IMAGE_FocusControlAutoInfinity ) ) { 2918cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman stopAutoFocus(); 2928cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //Signal a dummy AF event so that in case the callback from ducati 2938cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //does come then it doesnt crash after 2948cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //exiting this function since eventSem will go out of scope. 2958cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret |= SignalEvent(mCameraAdapterParameters.mHandleComp, 2968cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, 2978cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman OMX_ALL, 2988cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman OMX_IndexConfigCommonFocusStatus, 2998cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman NULL ); 30085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman } 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 302aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // If the apps call #cancelAutoFocus()}, the face callbacks will also resume. 303aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(false); 304aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setFocusCallback(bool enabled) 312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_CALLBACKREQUESTTYPE focusRequstCallback; 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&focusRequstCallback, OMX_CONFIG_CALLBACKREQUESTTYPE); 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.nPortIndex = OMX_ALL; 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.nIndex = OMX_IndexConfigCommonFocusStatus; 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( enabled ) 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.bEnable = OMX_TRUE; 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.bEnable = OMX_FALSE; 339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_INDEXTYPE) OMX_IndexConfigCallbackRequest, 343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusRequstCallback); 344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error registering focus callback 0x%x", eError); 347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Autofocus callback for index 0x%x registered successfully", 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus); 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::returnFocusStatus(bool timeoutReached) 362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_PARAM_FOCUSSTATUSTYPE eFocusStatus; 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool focusStatus = false; 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BaseCameraAdapter::AdapterState state; 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BaseCameraAdapter::getState(state); 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT(eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( ( AF_ACTIVE & state ) != AF_ACTIVE ) 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// We don't send focus callback if focus was not started 376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !timeoutReached ) 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = checkFocus(&eFocusStatus); 385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Focus status check failed!"); 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( timeoutReached ) 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusStatus = false; 399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 400e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman ///FIXME: The ducati seems to return focus as false always if continuous focus is enabled 401e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman ///So, return focus as locked always until this is fixed. 402e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman else if(mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) 403e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman { 404e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman focusStatus = true; 405e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman } 406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch (eFocusStatus.eFocusStatus) 409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusReached: 411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusStatus = true; 41380c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman //Lock the AE and AWB here sinc the focus is locked 41480c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman // Apply 3A locks after AF 41580c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman if( set3ALock(OMX_TRUE) != NO_ERROR) { 41680c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman CAMHAL_LOGEA("Error Applying 3A locks"); 41780c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman } 41880c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman else 41980c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman { 420c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu CAMHAL_LOGDA("Focus locked. Applied focus locks successfully"); 42180c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman } 422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusOff: 425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusUnableToReach: 426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusRequest: 427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusStatus = false; 430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev stopAutoFocus(); 435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4388cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret = BaseCameraAdapter::setState(CAMERA_CANCEL_AUTOFOCUS); 439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4418cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret = BaseCameraAdapter::commitState(); 4428cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman } 4438cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman else 4448cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman { 4458cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret |= BaseCameraAdapter::rollbackState(); 446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev notifyFocusSubscribers(focusStatus); 451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 453aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // After focus, face detection will resume sending face callbacks 454aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(false); 455aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::checkFocus(OMX_PARAM_FOCUSSTATUSTYPE *eFocusStatus) 462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == eFocusStatus ) 469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid focus status"); 471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); 483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus, 486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eFocusStatus); 487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while retrieving focus status: 0x%x", eError); 490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Focus Status: %d", eFocusStatus->eFocusStatus); 497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::updateFocusDistances(CameraParameters ¶ms) 505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 focusNear, focusOptimal, focusFar; 507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = getFocusDistances(focusNear, focusOptimal, focusFar); 512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret) 513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = addFocusDistances(focusNear, focusOptimal, focusFar, params); 515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error in call to addFocusDistances() 0x%x", ret); 518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error in call to getFocusDistances() 0x%x", ret); 523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::getFocusDistances(OMX_U32 &near,OMX_U32 &optimal, OMX_U32 &far) 531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError; 534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_TI_CONFIG_FOCUSDISTANCETYPE focusDist; 536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = UNKNOWN_ERROR; 543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR(&focusDist, OMX_TI_CONFIG_FOCUSDISTANCETYPE); 548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusDist.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_TI_IndexConfigFocusDistance, 552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusDist); 553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while querying focus distances 0x%x", eError); 556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = UNKNOWN_ERROR; 557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev near = focusDist.nFocusDistanceNear; 564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev optimal = focusDist.nFocusDistanceOptimal; 565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev far = focusDist.nFocusDistanceFar; 566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::encodeFocusDistance(OMX_U32 dist, char *buffer, size_t length) 574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t focusScale = 1000; 577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev float distFinal; 578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mParameters3A.Focus == OMX_IMAGE_FocusControlAutoInfinity) 582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev dist=0; 584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( 0 == dist ) 589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strncpy(buffer, CameraParameters::FOCUS_DISTANCE_INFINITY, ( length - 1 )); 591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev distFinal = dist; 595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev distFinal /= focusScale; 596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev snprintf(buffer, ( length - 1 ) , "%5.3f", distFinal); 597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::addFocusDistances(OMX_U32 &near, 606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 &optimal, 607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 &far, 608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraParameters& params) 609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(near, mFocusDistNear, FOCUS_DIST_SIZE); 617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(optimal, mFocusDistOptimal, FOCUS_DIST_SIZE); 626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(far, mFocusDistFar, FOCUS_DIST_SIZE); 635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev snprintf(mFocusDistBuffer, ( FOCUS_DIST_BUFFER_SIZE - 1) ,"%s,%s,%s", mFocusDistNear, 644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFocusDistOptimal, 645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFocusDistFar); 646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev params.set(CameraParameters::KEY_FOCUS_DISTANCES, mFocusDistBuffer); 648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 655708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchevstatus_t OMXCameraAdapter::setTouchFocus() 656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 659708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 660708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_ALGOAREASTYPE **focusAreas; 661708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_TI_CONFIG_SHAREDBUFFER sharedBuffer; 662708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev MemoryManager memMgr; 663708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev int areasSize = 0; 664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 676708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev areasSize = ((sizeof(OMX_ALGOAREASTYPE)+4095)/4096)*4096; 677708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas = (OMX_ALGOAREASTYPE**) memMgr.allocateBuffer(0, 0, NULL, areasSize, 1); 678708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 679708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMXCameraPortParameters * mPreviewData = NULL; 680708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex]; 681708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 682708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if (!focusAreas) 683708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 684708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGEB("Error allocating buffer for focus areas %d", eError); 685708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev return -ENOMEM; 686708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 687708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 688708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_INIT_STRUCT_PTR (focusAreas[0], OMX_ALGOAREASTYPE); 689708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 690708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nPortIndex = OMX_ALL; 691708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nNumAreas = mFocusAreas.size(); 692708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nAlgoAreaPurpose = OMX_AlgoAreaFocus; 693708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 694708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // If the area is the special case of (0, 0, 0, 0, 0), then 695708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // the algorithm needs nNumAreas to be set to 0, 696708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // in order to automatically choose the best fitting areas. 697708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if ( mFocusAreas.itemAt(0)->isZeroArea() ) 698708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 699708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->nNumAreas = 0; 700708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 701708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 702708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev for ( unsigned int n = 0; n < mFocusAreas.size(); n++) 703708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 704708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev // transform the coordinates to 3A-type coordinates 705708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev mFocusAreas.itemAt(n)->transfrom((size_t)mPreviewData->mWidth, 706708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t)mPreviewData->mHeight, 707708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nTop, 708708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nLeft, 709708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nWidth, 710708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (size_t&)focusAreas[0]->tAlgoAreas[n].nHeight); 711708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 712708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nLeft = 713708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nLeft * TOUCH_FOCUS_RANGE ) / mPreviewData->mWidth; 714708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nTop = 715708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nTop* TOUCH_FOCUS_RANGE ) / mPreviewData->mHeight; 716708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nWidth = 717708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nWidth * TOUCH_FOCUS_RANGE ) / mPreviewData->mWidth; 718708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nHeight = 719708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ( focusAreas[0]->tAlgoAreas[n].nHeight * TOUCH_FOCUS_RANGE ) / mPreviewData->mHeight; 720708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas[0]->tAlgoAreas[n].nPriority = mFocusAreas.itemAt(n)->getWeight(); 721708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 722708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGDB("Focus area %d : top = %d left = %d width = %d height = %d prio = %d", 723708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev n, (int)focusAreas[0]->tAlgoAreas[n].nTop, (int)focusAreas[0]->tAlgoAreas[n].nLeft, 724708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (int)focusAreas[0]->tAlgoAreas[n].nWidth, (int)focusAreas[0]->tAlgoAreas[n].nHeight, 725708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (int)focusAreas[0]->tAlgoAreas[n].nPriority); 726708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 727708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 728708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev OMX_INIT_STRUCT_PTR (&sharedBuffer, OMX_TI_CONFIG_SHAREDBUFFER); 729708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 730708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev sharedBuffer.nPortIndex = OMX_ALL; 731708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev sharedBuffer.nSharedBuffSize = areasSize; 732708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev sharedBuffer.pSharedBuff = (OMX_U8 *) focusAreas[0]; 733708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 734708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if ( NULL == sharedBuffer.pSharedBuff ) 735708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 736708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGEA("No resources to allocate OMX shared buffer"); 737708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ret = -ENOMEM; 738708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev goto EXIT; 739708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 740708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 741708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 742708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev (OMX_INDEXTYPE) OMX_TI_IndexConfigAlgoAreas, &sharedBuffer); 743708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 746708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev CAMHAL_LOGEB("Error while setting Focus Areas configuration 0x%x", eError); 747708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev ret = -EINVAL; 748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 749708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev 750708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev EXIT: 751708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev if (NULL != focusAreas) 752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 753708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev memMgr.freeBuffer((void*) focusAreas); 754708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev focusAreas = NULL; 755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 764