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