OMXFocus.cpp revision 030e1a5962195aa5914e76e3d071669869555a9f
1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*
2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/
3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License");
5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License.
6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at
7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *      http://www.apache.org/licenses/LICENSE-2.0
9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software
11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS,
12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and
14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License.
15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @file OMXFocus.cpp
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This file contains functionality for handling focus configurations.
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#undef LOG_TAG
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_TAG "CameraHAL"
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h"
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMXCameraAdapter.h"
3100479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman#include "ErrorUtils.h"
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define TOUCH_FOCUS_RANGE 0xFF
349b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng#define AF_CALLBACK_TIMEOUT 5000000 //5 seconds timeout
35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android {
37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setParametersFocus(const CameraParameters &params,
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              BaseCameraAdapter::AdapterState state)
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *str = NULL;
435458bdc45048501d1919b14d22456de91f7e8950Tyler Luu    Vector< sp<CameraArea> > tempAreas;
44708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev    size_t MAX_FOCUS_AREAS;
45708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
485458bdc45048501d1919b14d22456de91f7e8950Tyler Luu    Mutex::Autolock lock(mFocusAreasLock);
495458bdc45048501d1919b14d22456de91f7e8950Tyler Luu
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    str = params.get(CameraParameters::KEY_FOCUS_AREAS);
51708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
52708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev    MAX_FOCUS_AREAS = atoi(params.get(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS));
53708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
549e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu    if ( NULL != str ) {
555458bdc45048501d1919b14d22456de91f7e8950Tyler Luu        ret = CameraArea::parseAreas(str, ( strlen(str) + 1 ), tempAreas);
569e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu    }
579e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu
585458bdc45048501d1919b14d22456de91f7e8950Tyler Luu    if ( (NO_ERROR == ret) && CameraArea::areAreasDifferent(mFocusAreas, tempAreas) ) {
595458bdc45048501d1919b14d22456de91f7e8950Tyler Luu        mFocusAreas.clear();
605458bdc45048501d1919b14d22456de91f7e8950Tyler Luu        mFocusAreas = tempAreas;
619e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu        if ( MAX_FOCUS_AREAS < mFocusAreas.size() ) {
629e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu            CAMHAL_LOGEB("Focus areas supported %d, focus areas set %d",
639e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu                         MAX_FOCUS_AREAS,
649e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu                         mFocusAreas.size());
659e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu            ret = -EINVAL;
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
67f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov        else {
68f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov            if ( !mFocusAreas.isEmpty() ) {
69f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov                setTouchFocus();
70f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov            }
71f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov        }
729e5cb561cc54d061fe9f3d05eae78f6efb70f2c2Tyler Luu    }
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::doAutoFocus()
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl;
8485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    OMX_PARAM_FOCUSSTATUSTYPE focusStatus;
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
88b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng    if ( OMX_StateInvalid == mComponentState )
89b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng      {
90b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        CAMHAL_LOGEA("OMX component in Invalid state");
91b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        returnFocusStatus(false);
92b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        return -EINVAL;
93b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng      }
94b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component not in executing state");
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        returnFocusStatus(false);
99b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        return NO_ERROR;
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 != mDoAFSem.Count() )
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error mDoAFSem semaphore count %d", mDoAFSem.Count());
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
108030e1a5962195aa5914e76e3d071669869555a9fTyler Luu    if( ((AF_ACTIVE & getState()) != AF_ACTIVE) && ((AF_ACTIVE & getNextState()) != AF_ACTIVE) ) {
109030e1a5962195aa5914e76e3d071669869555a9fTyler Luu       CAMHAL_LOGDA("Auto focus got canceled before doAutoFocus could be called");
110030e1a5962195aa5914e76e3d071669869555a9fTyler Luu       return NO_ERROR;
111030e1a5962195aa5914e76e3d071669869555a9fTyler Luu    }
112030e1a5962195aa5914e76e3d071669869555a9fTyler Luu
113aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    // If the app calls autoFocus, the camera will stop sending face callbacks.
114aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    pauseFaceDetection(true);
115aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
116f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov    // This is needed for applying FOCUS_REGION correctly
117f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov    if ( (!mFocusAreas.isEmpty()) && (!mFocusAreas.itemAt(0)->isZeroArea()))
118f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov    {
119f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov    //Disable face priority
120f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov    setAlgoPriority(FACE_PRIORITY, FOCUS_ALGO, false);
121f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov
122f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov    //Enable region algorithm priority
123f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov    setAlgoPriority(REGION_PRIORITY, FOCUS_ALGO, true);
124f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov    }
125f2ac1cc4c58440d94972f0015f50bcbb13838611Atanas Stefov
12685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE);
12785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    focusControl.eFocusControl = ( OMX_IMAGE_FOCUSCONTROLTYPE ) mParameters3A.Focus;
12885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman
1290e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu    if (mParameters3A.FocusLock) {
1300e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        // this basically means user never called cancelAutoFocus after a scan...
1310e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        // if this is the case we need to unlock AF to ensure we will do a scan
1320e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        if (set3ALock(mUserSetExpLock, mUserSetWbLock, OMX_FALSE) != NO_ERROR) {
1330e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            CAMHAL_LOGEA("Error Unlocking 3A locks");
1340e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        } else {
1350e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            CAMHAL_LOGDA("AE/AWB unlocked successfully");
1360e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        }
137f5f41aa7943adde4e7bfb3fc181de154c4b0b9b0Sundar Raman
1380e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu    } else if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAuto ) {
1390e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        // In case we have CAF running we should first check the AF status.
1400e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        // If it has managed to lock, then do as usual and return status
1410e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        // immediately. If lock is not available, then switch temporarily
1420e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        // to 'autolock' and do normal AF.
14385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        ret = checkFocus(&focusStatus);
14485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        if ( NO_ERROR != ret ) {
14585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman            CAMHAL_LOGEB("Focus status check failed 0x%x!", ret);
14685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman            return ret;
14785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        } else {
14885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman            CAMHAL_LOGDB("Focus status check 0x%x!", focusStatus.eFocusStatus);
14985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        }
15085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    }
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
15285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    if ( ( focusControl.eFocusControl != OMX_IMAGE_FocusControlAuto ) &&
15385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman         ( focusControl.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE )
15485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman                 OMX_IMAGE_FocusControlAutoInfinity ) ) {
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
15685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        ret = RegisterForEvent(mCameraAdapterParameters.mHandleComp,
15785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman                                    (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
15885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman                                    OMX_ALL,
15985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman                                    OMX_IndexConfigCommonFocusStatus,
16085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman                                    mDoAFSem);
1618cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman
16285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        if ( NO_ERROR == ret ) {
16385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman            ret = setFocusCallback(true);
16485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        }
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1660e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
1670e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu                                OMX_IndexConfigFocusControl,
1680e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu                                &focusControl);
1696b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
1700e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        if ( OMX_ErrorNone != eError ) {
1710e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            CAMHAL_LOGEB("Error while starting focus 0x%x", eError);
1720e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            return INVALID_OPERATION;
1730e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        } else {
1740e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            CAMHAL_LOGDA("Autofocus started successfully");
1750e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu        }
1766b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
1770e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu       if(mDoAFSem.WaitTimeout(AF_CALLBACK_TIMEOUT) != NO_ERROR) {
1780e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            //If somethiing bad happened while we wait
1790e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            if (mComponentState == OMX_StateInvalid) {
1800e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu                CAMHAL_LOGEA("Invalid State after Auto Focus Exitting!!!");
1810e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu                return EINVAL;
1820e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            }
1836b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng
1840e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            //Disable auto focus callback from Ducati
1859b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng            setFocusCallback(false);
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Autofocus callback timeout expired");
1879b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng            RemoveEvent(mCameraAdapterParameters.mHandleComp,
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        OMX_ALL,
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        OMX_IndexConfigCommonFocusStatus,
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        NULL );
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            returnFocusStatus(true);
19385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        } else {
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Autofocus callback received");
1959b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng            //Disable auto focus callback from Ducati
1969b981b1785b6758b2dc8b147587188e5cf0d893dAkwasi Boateng            setFocusCallback(false);
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = returnFocusStatus(false);
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1990e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu    } else { // Focus mode in continuous
20085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        if ( NO_ERROR == ret ) {
201e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman            ret = returnFocusStatus(false);
202f50bf42f39a1d1ca8505d198b41c557e8ca83668Heechan Park            mPending3Asettings |= SetFocus;
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
20485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    }
20585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopAutoFocus()
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusControl;
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
219b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng    if ( OMX_StateInvalid == mComponentState )
220b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng      {
221b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        CAMHAL_LOGEA("OMX component in Invalid state");
222b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        returnFocusStatus(false);
223b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        return -EINVAL;
224b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng      }
225b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
228b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng          CAMHAL_LOGEA("OMX component not in executing state");
229b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        return NO_ERROR;
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mParameters3A.Focus == OMX_IMAGE_FocusControlAutoInfinity ) {
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // No need to stop focus if we are in infinity mode. Nothing to stop.
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev       {
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev       //Disable the callback first
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev       ret = setFocusCallback(false);
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev       }
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&focusControl, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE);
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        focusControl.eFocusControl = OMX_IMAGE_FocusControlOff;
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_IndexConfigFocusControl,
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &focusControl);
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error while stopping focus 0x%x", eError);
25400479a8f1d791824870513b8b0b9edd67d2560ffSundar Raman            return ErrorUtils::omxToAndroidError(eError);
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
26385c859b69b3c003b8db810371e24fe41599fc7deSundar Ramanstatus_t OMXCameraAdapter::getFocusMode(OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE &focusMode)
26485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman{;
26585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    OMX_ERRORTYPE eError = OMX_ErrorNone;
26685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman
26785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    LOG_FUNCTION_NAME;
26885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman
26985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    if ( OMX_StateInvalid == mComponentState ) {
27085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        CAMHAL_LOGEA("OMX component is in invalid state");
27185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        return NO_INIT;
27285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    }
27385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman
27485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    OMX_INIT_STRUCT_PTR (&focusMode, OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE);
27585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    focusMode.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
27685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman
27785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    eError =  OMX_GetConfig(mCameraAdapterParameters.mHandleComp,
27885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman                            OMX_IndexConfigFocusControl,
27985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman                            &focusMode);
28085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman
28185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    if ( OMX_ErrorNone != eError ) {
28285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        CAMHAL_LOGEB("Error while retrieving focus mode 0x%x", eError);
28385c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    }
28485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman
28585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    LOG_FUNCTION_NAME_EXIT;
28685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman
28785c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    return ErrorUtils::omxToAndroidError(eError);
28885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman}
28985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman
290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::cancelAutoFocus()
291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
29485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE focusMode;
295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
29885c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    ret = getFocusMode(focusMode);
29985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    if ( NO_ERROR != ret ) {
30085c859b69b3c003b8db810371e24fe41599fc7deSundar Raman        return ret;
30185c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    }
30285c859b69b3c003b8db810371e24fe41599fc7deSundar Raman
3038cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman    //Stop the AF only for modes other than CAF  or Inifinity
30485c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    if ( ( focusMode.eFocusControl != OMX_IMAGE_FocusControlAuto ) &&
30585c859b69b3c003b8db810371e24fe41599fc7deSundar Raman         ( focusMode.eFocusControl != ( OMX_IMAGE_FOCUSCONTROLTYPE )
30685c859b69b3c003b8db810371e24fe41599fc7deSundar Raman                 OMX_IMAGE_FocusControlAutoInfinity ) ) {
3078cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman        stopAutoFocus();
3088cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman        //Signal a dummy AF event so that in case the callback from ducati
3098cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman        //does come then it doesnt crash after
3108cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman        //exiting this function since eventSem will go out of scope.
3118cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman        ret |= SignalEvent(mCameraAdapterParameters.mHandleComp,
3128cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman                                    (OMX_EVENTTYPE) OMX_EventIndexSettingChanged,
3138cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman                                    OMX_ALL,
3148cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman                                    OMX_IndexConfigCommonFocusStatus,
3158cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman                                    NULL );
3168a35a0ca4d30702b693c92f8cee360a8d102f49eTyler Luu    } else if (focusMode.eFocusControl == OMX_IMAGE_FocusControlAuto) {
3178a35a0ca4d30702b693c92f8cee360a8d102f49eTyler Luu       // re-apply CAF after unlocking and canceling
3188a35a0ca4d30702b693c92f8cee360a8d102f49eTyler Luu       mPending3Asettings |= SetFocus;
31985c859b69b3c003b8db810371e24fe41599fc7deSundar Raman    }
320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
321aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    // If the apps call #cancelAutoFocus()}, the face callbacks will also resume.
322aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    pauseFaceDetection(false);
323aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setFocusCallback(bool enabled)
331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_CALLBACKREQUESTTYPE focusRequstCallback;
335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
338b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng    if ( OMX_StateInvalid == mComponentState )
339b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng      {
340b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        CAMHAL_LOGEA("OMX component in Invalid state");
341b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        ret = -EINVAL;
342b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng      }
343b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng
344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
346b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng          CAMHAL_LOGEA("OMX component not in executing state");
347b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        ret = NO_ERROR;
348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&focusRequstCallback, OMX_CONFIG_CALLBACKREQUESTTYPE);
354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        focusRequstCallback.nPortIndex = OMX_ALL;
355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        focusRequstCallback.nIndex = OMX_IndexConfigCommonFocusStatus;
356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( enabled )
358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            focusRequstCallback.bEnable = OMX_TRUE;
360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            focusRequstCallback.bEnable = OMX_FALSE;
364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                (OMX_INDEXTYPE) OMX_IndexConfigCallbackRequest,
368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &focusRequstCallback);
369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error registering focus callback 0x%x", eError);
372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDB("Autofocus callback for index 0x%x registered successfully",
377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                         OMX_IndexConfigCommonFocusStatus);
378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::returnFocusStatus(bool timeoutReached)
387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_PARAM_FOCUSSTATUSTYPE eFocusStatus;
390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool focusStatus = false;
391bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu    BaseCameraAdapter::AdapterState state, nextState;
392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    BaseCameraAdapter::getState(state);
393bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu    BaseCameraAdapter::getNextState(nextState);
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_INIT_STRUCT(eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE);
398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
399bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu    if( ((AF_ACTIVE & state ) != AF_ACTIVE) && ((AF_ACTIVE & nextState ) != AF_ACTIVE) )
400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev       {
401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// We don't send focus callback if focus was not started
402bbdc0fa0b8720bcfcf602861f62802c1fa1995c4Tyler Luu       CAMHAL_LOGDA("Not sending focus callback because focus was not started");
403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev       return NO_ERROR;
404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev       }
405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( !timeoutReached )
410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = checkFocus(&eFocusStatus);
412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("Focus status check failed!");
416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( timeoutReached )
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            focusStatus = false;
426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            switch (eFocusStatus.eFocusStatus)
430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    case OMX_FocusStatusReached:
432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        focusStatus = true;
434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        break;
435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    case OMX_FocusStatusOff:
437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    case OMX_FocusStatusUnableToReach:
438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    case OMX_FocusStatusRequest:
439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    default:
440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        focusStatus = false;
442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        break;
443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
4450e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            // Lock CAF after AF call
4460e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            if( set3ALock(mUserSetExpLock, mUserSetWbLock, OMX_TRUE) != NO_ERROR) {
4477d56715ab78f6b4be347597dc439d598cfe47dc9Sundar Raman                CAMHAL_LOGEA("Error Applying 3A locks");
4480e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            } else {
4497d56715ab78f6b4be347597dc439d598cfe47dc9Sundar Raman                CAMHAL_LOGDA("Focus locked. Applied focus locks successfully");
4500e2a9f1fabc12a1a1123f8374d0e4d6faf5a2d62Tyler Luu            }
451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            stopAutoFocus();
453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
454fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        //Query current focus distance after AF is complete
455fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        updateFocusDistances(mParameters);
456fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu       }
457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4588cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman    ret =  BaseCameraAdapter::setState(CAMERA_CANCEL_AUTOFOCUS);
459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
4618cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman        ret = BaseCameraAdapter::commitState();
4628cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman        }
4638cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman    else
4648cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman        {
4658cb48e582f4f3c93aa25159c1116a7c83bfa388aSundar Raman        ret |= BaseCameraAdapter::rollbackState();
466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        notifyFocusSubscribers(focusStatus);
471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
473aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    // After focus, face detection will resume sending face callbacks
474aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu    pauseFaceDetection(false);
475aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::checkFocus(OMX_PARAM_FOCUSSTATUSTYPE *eFocusStatus)
482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == eFocusStatus )
489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid focus status");
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
494b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng    if ( OMX_StateInvalid == mComponentState )
495b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng      {
496b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        CAMHAL_LOGEA("OMX component in Invalid state");
497b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        ret = -EINVAL;
498b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng      }
499b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng
500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateExecuting != mComponentState )
501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component not in executing state");
503b192289737a7616f76a1cc236ed3cbc704696c03Akwasi Boateng        ret = NO_ERROR;
504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (eFocusStatus, OMX_PARAM_FOCUSSTATUSTYPE);
509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp,
511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               OMX_IndexConfigCommonFocusStatus,
512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               eFocusStatus);
513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error while retrieving focus status: 0x%x", eError);
516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Focus Status: %d", eFocusStatus->eFocusStatus);
523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::updateFocusDistances(CameraParameters &params)
531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_U32 focusNear, focusOptimal, focusFar;
533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = getFocusDistances(focusNear, focusOptimal, focusFar);
538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret)
539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = addFocusDistances(focusNear, focusOptimal, focusFar, params);
541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("Error in call to addFocusDistances() 0x%x", ret);
544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Error in call to getFocusDistances() 0x%x", ret);
549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::getFocusDistances(OMX_U32 &near,OMX_U32 &optimal, OMX_U32 &far)
557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError;
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_TI_CONFIG_FOCUSDISTANCETYPE focusDist;
562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateInvalid == mComponentState )
566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is in invalid state");
568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = UNKNOWN_ERROR;
569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR(&focusDist, OMX_TI_CONFIG_FOCUSDISTANCETYPE);
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        focusDist.nPortIndex = mCameraAdapterParameters.mPrevPortIndex;
575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError = OMX_GetConfig(mCameraAdapterParameters.mHandleComp,
577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               ( OMX_INDEXTYPE ) OMX_TI_IndexConfigFocusDistance,
578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                               &focusDist);
579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error while querying focus distances 0x%x", eError);
582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = UNKNOWN_ERROR;
583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        near = focusDist.nFocusDistanceNear;
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        optimal = focusDist.nFocusDistanceOptimal;
591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        far = focusDist.nFocusDistanceFar;
592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::encodeFocusDistance(OMX_U32 dist, char *buffer, size_t length)
600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    uint32_t focusScale = 1000;
603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    float distFinal;
604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mParameters3A.Focus == OMX_IMAGE_FocusControlAutoInfinity)
608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        dist=0;
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( 0 == dist )
615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            strncpy(buffer, CameraParameters::FOCUS_DISTANCE_INFINITY, ( length - 1 ));
617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            distFinal = dist;
621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            distFinal /= focusScale;
622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            snprintf(buffer, ( length - 1 ) , "%5.3f", distFinal);
623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::addFocusDistances(OMX_U32 &near,
632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                             OMX_U32 &optimal,
633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                             OMX_U32 &far,
634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                             CameraParameters& params)
635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = encodeFocusDistance(near, mFocusDistNear, FOCUS_DIST_SIZE);
643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret);
646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = encodeFocusDistance(optimal, mFocusDistOptimal, FOCUS_DIST_SIZE);
652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret);
655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = encodeFocusDistance(far, mFocusDistFar, FOCUS_DIST_SIZE);
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error encoding near focus distance 0x%x", ret);
664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        snprintf(mFocusDistBuffer, ( FOCUS_DIST_BUFFER_SIZE - 1) ,"%s,%s,%s", mFocusDistNear,
670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                              mFocusDistOptimal,
671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                              mFocusDistFar);
672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        params.set(CameraParameters::KEY_FOCUS_DISTANCES, mFocusDistBuffer);
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
681708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchevstatus_t OMXCameraAdapter::setTouchFocus()
682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
685708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
686708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev    OMX_ALGOAREASTYPE **focusAreas;
687708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev    OMX_TI_CONFIG_SHAREDBUFFER sharedBuffer;
688708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev    MemoryManager memMgr;
689708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev    int areasSize = 0;
690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateInvalid == mComponentState )
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is in invalid state");
696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -1;
697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
702708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        areasSize = ((sizeof(OMX_ALGOAREASTYPE)+4095)/4096)*4096;
703708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        focusAreas = (OMX_ALGOAREASTYPE**) memMgr.allocateBuffer(0, 0, NULL, areasSize, 1);
704708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
705708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        OMXCameraPortParameters * mPreviewData = NULL;
706708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        mPreviewData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mPrevPortIndex];
707708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
708708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        if (!focusAreas)
709708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            {
710708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            CAMHAL_LOGEB("Error allocating buffer for focus areas %d", eError);
711708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            return -ENOMEM;
712708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            }
713708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
714708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        OMX_INIT_STRUCT_PTR (focusAreas[0], OMX_ALGOAREASTYPE);
715708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
716708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        focusAreas[0]->nPortIndex = OMX_ALL;
717708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        focusAreas[0]->nNumAreas = mFocusAreas.size();
718708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        focusAreas[0]->nAlgoAreaPurpose = OMX_AlgoAreaFocus;
719708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
720708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        // If the area is the special case of (0, 0, 0, 0, 0), then
721708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        // the algorithm needs nNumAreas to be set to 0,
722708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        // in order to automatically choose the best fitting areas.
723708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        if ( mFocusAreas.itemAt(0)->isZeroArea() )
724708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            {
725708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            focusAreas[0]->nNumAreas = 0;
726708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            }
727708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
728708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        for ( unsigned int n = 0; n < mFocusAreas.size(); n++)
729708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            {
730708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            // transform the coordinates to 3A-type coordinates
731708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            mFocusAreas.itemAt(n)->transfrom((size_t)mPreviewData->mWidth,
732708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                                            (size_t)mPreviewData->mHeight,
733708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                                            (size_t&)focusAreas[0]->tAlgoAreas[n].nTop,
734708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                                            (size_t&)focusAreas[0]->tAlgoAreas[n].nLeft,
735708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                                            (size_t&)focusAreas[0]->tAlgoAreas[n].nWidth,
736708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                                            (size_t&)focusAreas[0]->tAlgoAreas[n].nHeight);
737708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
738708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            focusAreas[0]->tAlgoAreas[n].nLeft =
739708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                    ( focusAreas[0]->tAlgoAreas[n].nLeft * TOUCH_FOCUS_RANGE ) / mPreviewData->mWidth;
740708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            focusAreas[0]->tAlgoAreas[n].nTop =
741708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                    ( focusAreas[0]->tAlgoAreas[n].nTop* TOUCH_FOCUS_RANGE ) / mPreviewData->mHeight;
742708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            focusAreas[0]->tAlgoAreas[n].nWidth =
743708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                    ( focusAreas[0]->tAlgoAreas[n].nWidth * TOUCH_FOCUS_RANGE ) / mPreviewData->mWidth;
744708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            focusAreas[0]->tAlgoAreas[n].nHeight =
745708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                    ( focusAreas[0]->tAlgoAreas[n].nHeight * TOUCH_FOCUS_RANGE ) / mPreviewData->mHeight;
746708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            focusAreas[0]->tAlgoAreas[n].nPriority = mFocusAreas.itemAt(n)->getWeight();
747708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
748708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev             CAMHAL_LOGDB("Focus area %d : top = %d left = %d width = %d height = %d prio = %d",
749708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                    n, (int)focusAreas[0]->tAlgoAreas[n].nTop, (int)focusAreas[0]->tAlgoAreas[n].nLeft,
750708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                    (int)focusAreas[0]->tAlgoAreas[n].nWidth, (int)focusAreas[0]->tAlgoAreas[n].nHeight,
751708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                    (int)focusAreas[0]->tAlgoAreas[n].nPriority);
752708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev             }
753708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
754708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        OMX_INIT_STRUCT_PTR (&sharedBuffer, OMX_TI_CONFIG_SHAREDBUFFER);
755708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
756708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        sharedBuffer.nPortIndex = OMX_ALL;
757708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        sharedBuffer.nSharedBuffSize = areasSize;
758708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        sharedBuffer.pSharedBuff = (OMX_U8 *) focusAreas[0];
759708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
760708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        if ( NULL == sharedBuffer.pSharedBuff )
761708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            {
762708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            CAMHAL_LOGEA("No resources to allocate OMX shared buffer");
763708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            ret = -ENOMEM;
764708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            goto EXIT;
765708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            }
766708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
767708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
768708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev                                      (OMX_INDEXTYPE) OMX_TI_IndexConfigAlgoAreas, &sharedBuffer);
769708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
772708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            CAMHAL_LOGEB("Error while setting Focus Areas configuration 0x%x", eError);
773708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            ret = -EINVAL;
774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
775708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev
776708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev    EXIT:
777708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        if (NULL != focusAreas)
778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
779708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            memMgr.freeBuffer((void*) focusAreas);
780708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            focusAreas = NULL;
781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
790