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