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