OMXFocus.cpp revision 8cb48e582f4f3c93aa25159c1116a7c83bfa388a
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; 43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev str = params.get(CameraParameters::KEY_FOCUS_AREAS); 47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFocusAreas.clear(); 489e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu if ( NULL != str ) { 499e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu ret = CameraArea::parseFocusArea(str, strlen(str), mFocusAreas); 509e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu } 519e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu 529e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu if ( NO_ERROR == ret ) { 539e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu if ( MAX_FOCUS_AREAS < mFocusAreas.size() ) { 549e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu CAMHAL_LOGEB("Focus areas supported %d, focus areas set %d", 559e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu MAX_FOCUS_AREAS, 569e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu mFocusAreas.size()); 579e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu ret = -EINVAL; 58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 599e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu } 60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::doAutoFocus() 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl; 71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev returnFocusStatus(false); 78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( 0 != mDoAFSem.Count() ) 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error mDoAFSem semaphore count %d", mDoAFSem.Count()); 84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 87aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // If the app calls autoFocus, the camera will stop sending face callbacks. 88aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(true); 89aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) mParameters3A.Focus; 94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( mParameters3A.Focus != OMX_IMAGE_FocusControlAuto ) && 96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mParameters3A.Focus != OMX_IMAGE_FocusControlAutoInfinity ) ) 97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp, 100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, 101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ALL, 102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus, 103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDoAFSem); 104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = setFocusCallback(true); 108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1098cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman 110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigFocusControl, 114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusControl); 115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while starting focus 0x%x", eError); 119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return INVALID_OPERATION; 120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Autofocus started successfully"); 124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( mParameters3A.Focus != OMX_IMAGE_FocusControlAuto ) && 128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mParameters3A.Focus != OMX_IMAGE_FocusControlAutoInfinity ) ) 129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mDoAFSem.WaitTimeout(AF_CALLBACK_TIMEOUT); 131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Disable auto focus callback from Ducati 132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev setFocusCallback(false); 133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Signal a dummy AF event so that in case the callback from ducati 134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //does come then it doesnt crash after 135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //exiting this function since eventSem will go out of scope. 136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(ret != NO_ERROR) 137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Autofocus callback timeout expired"); 139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev SignalEvent(mCameraAdapterParameters.mHandleComp, 140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, 141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ALL, 142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus, 143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NULL ); 144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev returnFocusStatus(true); 145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Autofocus callback received"); 149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = returnFocusStatus(false); 150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 157e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman ret = returnFocusStatus(false); 158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopAutoFocus() 167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl; 171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAutoInfinity ) { 181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // No need to stop focus if we are in infinity mode. Nothing to stop. 182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Disable the callback first 188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = setFocusCallback(false); 189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE); 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusControl.eFocusControl = OMX_IMAGE_FocusControlOff; 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigFocusControl, 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusControl); 199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while stopping focus 0x%x", eError); 20200479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman return ErrorUtils::omxToAndroidError(eError); 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Query current focus distance after AF is complete 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev updateFocusDistances(mParameters); 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::cancelAutoFocus() 215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 220c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu // Unlock 3A locks since they were locked by AF 221c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu if( set3ALock(OMX_FALSE) != NO_ERROR) { 222c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu CAMHAL_LOGEA("Error Unlocking 3A locks"); 223c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu } 224c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu else{ 225c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu CAMHAL_LOGDA("AE/AWB unlocked successfully"); 226c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu } 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2288cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //Stop the AF only for modes other than CAF or Inifinity 2298cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman if ( ( mParameters3A.Focus != OMX_IMAGE_FocusControlAuto ) || 2308cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ( mParameters3A.Focus != OMX_IMAGE_FocusControlAutoInfinity ) ) 2318cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman { 2328cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman stopAutoFocus(); 2338cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //Signal a dummy AF event so that in case the callback from ducati 2348cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //does come then it doesnt crash after 2358cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman //exiting this function since eventSem will go out of scope. 2368cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret |= SignalEvent(mCameraAdapterParameters.mHandleComp, 2378cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman (OMX_EVENTTYPE) OMX_EventIndexSettingChanged, 2388cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman OMX_ALL, 2398cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman OMX_IndexConfigCommonFocusStatus, 2408cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman NULL ); 2418cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman } 242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 243aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // If the apps call #cancelAutoFocus()}, the face callbacks will also resume. 244aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(false); 245aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setFocusCallback(bool enabled) 253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_CALLBACKREQUESTTYPE focusRequstCallback; 257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&focusRequstCallback, OMX_CONFIG_CALLBACKREQUESTTYPE); 270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.nPortIndex = OMX_ALL; 271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.nIndex = OMX_IndexConfigCommonFocusStatus; 272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( enabled ) 274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.bEnable = OMX_TRUE; 276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusRequstCallback.bEnable = OMX_FALSE; 280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_INDEXTYPE) OMX_IndexConfigCallbackRequest, 284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusRequstCallback); 285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error registering focus callback 0x%x", eError); 288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Autofocus callback for index 0x%x registered successfully", 293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus); 294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::returnFocusStatus(bool timeoutReached) 303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_PARAM_FOCUSSTATUSTYPE eFocusStatus; 306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool focusStatus = false; 307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BaseCameraAdapter::AdapterState state; 308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev BaseCameraAdapter::getState(state); 309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT(eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); 313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( ( AF_ACTIVE & state ) != AF_ACTIVE ) 315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// We don't send focus callback if focus was not started 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !timeoutReached ) 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = checkFocus(&eFocusStatus); 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Focus status check failed!"); 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( timeoutReached ) 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusStatus = false; 340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 341e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman ///FIXME: The ducati seems to return focus as false always if continuous focus is enabled 342e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman ///So, return focus as locked always until this is fixed. 343e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman else if(mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) 344e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman { 345e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman focusStatus = true; 346e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman } 347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch (eFocusStatus.eFocusStatus) 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusReached: 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusStatus = true; 35480c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman //Lock the AE and AWB here sinc the focus is locked 35580c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman // Apply 3A locks after AF 35680c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman if( set3ALock(OMX_TRUE) != NO_ERROR) { 35780c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman CAMHAL_LOGEA("Error Applying 3A locks"); 35880c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman } 35980c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman else 36080c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman { 361c492aa718bc3f43eaf689b72595352f5348a0c39Tyler Luu CAMHAL_LOGDA("Focus locked. Applied focus locks successfully"); 36280c50ac56bfa97be0cf04332ec1d314637c8770fSundar Raman } 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusOff: 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusUnableToReach: 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case OMX_FocusStatusRequest: 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusStatus = false; 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev stopAutoFocus(); 376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3798cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret = BaseCameraAdapter::setState(CAMERA_CANCEL_AUTOFOCUS); 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3828cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret = BaseCameraAdapter::commitState(); 3838cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman } 3848cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman else 3858cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman { 3868cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman ret |= BaseCameraAdapter::rollbackState(); 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev notifyFocusSubscribers(focusStatus); 392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 394aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu // After focus, face detection will resume sending face callbacks 395aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu pauseFaceDetection(false); 396aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::checkFocus(OMX_PARAM_FOCUSSTATUSTYPE *eFocusStatus) 403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == eFocusStatus ) 410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid focus status"); 412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateExecuting != mComponentState ) 416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component not in executing state"); 418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE); 424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IndexConfigCommonFocusStatus, 427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eFocusStatus); 428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while retrieving focus status: 0x%x", eError); 431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Focus Status: %d", eFocusStatus->eFocusStatus); 438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::updateFocusDistances(CameraParameters ¶ms) 446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 focusNear, focusOptimal, focusFar; 448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = getFocusDistances(focusNear, focusOptimal, focusFar); 453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret) 454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = addFocusDistances(focusNear, focusOptimal, focusFar, params); 456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error in call to addFocusDistances() 0x%x", ret); 459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error in call to getFocusDistances() 0x%x", ret); 464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::getFocusDistances(OMX_U32 &near,OMX_U32 &optimal, OMX_U32 &far) 472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError; 475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_TI_CONFIG_FOCUSDISTANCETYPE focusDist; 477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = UNKNOWN_ERROR; 484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR(&focusDist, OMX_TI_CONFIG_FOCUSDISTANCETYPE); 489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusDist.nPortIndex = mCameraAdapterParameters.mPrevPortIndex; 490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp, 492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_TI_IndexConfigFocusDistance, 493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &focusDist); 494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while querying focus distances 0x%x", eError); 497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = UNKNOWN_ERROR; 498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev near = focusDist.nFocusDistanceNear; 505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev optimal = focusDist.nFocusDistanceOptimal; 506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev far = focusDist.nFocusDistanceFar; 507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::encodeFocusDistance(OMX_U32 dist, char *buffer, size_t length) 515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev uint32_t focusScale = 1000; 518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev float distFinal; 519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mParameters3A.Focus == OMX_IMAGE_FocusControlAutoInfinity) 523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev dist=0; 525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( 0 == dist ) 530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strncpy(buffer, CameraParameters::FOCUS_DISTANCE_INFINITY, ( length - 1 )); 532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev distFinal = dist; 536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev distFinal /= focusScale; 537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev snprintf(buffer, ( length - 1 ) , "%5.3f", distFinal); 538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::addFocusDistances(OMX_U32 &near, 547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 &optimal, 548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 &far, 549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraParameters& params) 550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(near, mFocusDistNear, FOCUS_DIST_SIZE); 558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(optimal, mFocusDistOptimal, FOCUS_DIST_SIZE); 567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = encodeFocusDistance(far, mFocusDistFar, FOCUS_DIST_SIZE); 576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret); 579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev snprintf(mFocusDistBuffer, ( FOCUS_DIST_BUFFER_SIZE - 1) ,"%s,%s,%s", mFocusDistNear, 585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFocusDistOptimal, 586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFocusDistFar); 587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev params.set(CameraParameters::KEY_FOCUS_DISTANCES, mFocusDistBuffer); 589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setTouchFocus(size_t posX, 597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t posY, 598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t posWidth, 599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t posHeight, 600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t previewWidth, 601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev size_t previewHeight) 602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CONFIG_EXTFOCUSREGIONTYPE touchControl; 606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_StateInvalid == mComponentState ) 610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("OMX component is in invalid state"); 612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INIT_STRUCT_PTR (&touchControl, OMX_CONFIG_EXTFOCUSREGIONTYPE); 618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev touchControl.nLeft = ( posX * TOUCH_FOCUS_RANGE ) / previewWidth; 619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev touchControl.nTop = ( posY * TOUCH_FOCUS_RANGE ) / previewHeight; 620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev touchControl.nWidth = ( posWidth * TOUCH_FOCUS_RANGE ) / previewWidth; 621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev touchControl.nHeight = ( posHeight * TOUCH_FOCUS_RANGE ) / previewHeight; 622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_SetConfig(mCameraAdapterParameters.mHandleComp, 624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( OMX_INDEXTYPE ) OMX_IndexConfigExtFocusRegion, 625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &touchControl); 626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( OMX_ErrorNone != eError ) 627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Error while configuring touch focus 0x%x", eError); 629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -1; 630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Touch focus %d,%d %d,%d configured successfuly", 634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( int ) touchControl.nLeft, 635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( int ) touchControl.nTop, 636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( int ) touchControl.nWidth, 637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( int ) touchControl.nHeight); 638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 647