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* @file OMXZoom.cpp
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This file contains functionality for handling zoom configurations.
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#undef LOG_TAG
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_TAG "CameraHAL"
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h"
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMXCameraAdapter.h"
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android {
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst int32_t OMXCameraAdapter::ZOOM_STEPS [ZOOM_STAGES] =  {
34704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                65536, 68157, 70124, 72745,
35704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                75366, 77988, 80609, 83231,
36704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                86508, 89784, 92406, 95683,
37704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                99615, 102892, 106168, 110100,
38704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                114033, 117965, 122552, 126484,
39704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                131072, 135660, 140247, 145490,
40704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                150733, 155976, 161219, 167117,
41704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                173015, 178913, 185467, 192020,
42704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                198574, 205783, 212992, 220201,
43704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                228065, 236585, 244449, 252969,
44704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                262144, 271319, 281149, 290980,
45704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                300810, 311951, 322437, 334234,
46704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                346030, 357827, 370934, 384041,
47704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                397148, 411566, 425984, 441057,
48704b8c03d4765b2f6d0a67bd175a7e9c51661c92Sundar Raman                                456131, 472515, 488899, 506593,
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                524288 };
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::setParametersZoom(const CameraParameters &params,
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                             BaseCameraAdapter::AdapterState state)
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mZoomLock);
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Immediate zoom should not be avaialable while smooth zoom is running
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( ZOOM_ACTIVE & state ) != ZOOM_ACTIVE )
62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int zoom = params.getInt(CameraParameters::KEY_ZOOM);
64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( zoom >= 0 ) && ( zoom < ZOOM_STAGES ) )
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mTargetZoomIdx = zoom;
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            //Immediate zoom should be applied instantly ( CTS requirement )
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCurrentZoomIdx = mTargetZoomIdx;
701c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman            if(!mZoomUpdating) {
711c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman                doZoom(mCurrentZoomIdx);
721c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman                mZoomUpdating = true;
731c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman            } else {
741c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman                mZoomUpdate = true;
751c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman            }
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDB("Zoom by App %d", zoom);
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::doZoom(int index)
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_ERRORTYPE eError = OMX_ErrorNone;
90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    OMX_CONFIG_SCALEFACTORTYPE zoomControl;
91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( OMX_StateInvalid == mComponentState )
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("OMX component is in invalid state");
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -1;
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (  ( 0 > index) || ( ( ZOOM_STAGES - 1 ) < index ) )
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Zoom index %d out of range", index);
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
106f9e7d93cfc739190426ae5c3d204980ec8b2e475Akwasi Boateng    if (mPreviousZoomIndx == index )
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        OMX_INIT_STRUCT_PTR (&zoomControl, OMX_CONFIG_SCALEFACTORTYPE);
114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        zoomControl.nPortIndex = OMX_ALL;
115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        zoomControl.xHeight = ZOOM_STEPS[index];
116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        zoomControl.xWidth = ZOOM_STEPS[index];
117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        eError =  OMX_SetConfig(mCameraAdapterParameters.mHandleComp,
119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                OMX_IndexConfigCommonDigitalZoom,
120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                &zoomControl);
121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( OMX_ErrorNone != eError )
122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Error while applying digital zoom 0x%x", eError);
124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Digital zoom applied successfully");
129f9e7d93cfc739190426ae5c3d204980ec8b2e475Akwasi Boateng            mPreviousZoomIndx = index;
130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::advanceZoom()
139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    AdapterState state;
1421c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman    Mutex::Autolock lock(mZoomLock);
1431c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    BaseCameraAdapter::getState(state);
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mReturnZoomStatus )
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1484fb9d8de9fd6e78637332886ab93b7da9bb6981dSundar Raman        mCurrentZoomIdx +=mZoomInc;
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mTargetZoomIdx = mCurrentZoomIdx;
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mReturnZoomStatus = false;
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = doZoom(mCurrentZoomIdx);
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        notifyZoomSubscribers(mCurrentZoomIdx, true);
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( mCurrentZoomIdx != mTargetZoomIdx )
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( ZOOM_ACTIVE & state )
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( mCurrentZoomIdx < mTargetZoomIdx )
159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mZoomInc = 1;
161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mZoomInc = -1;
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCurrentZoomIdx += mZoomInc;
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCurrentZoomIdx = mTargetZoomIdx;
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = doZoom(mCurrentZoomIdx);
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( ZOOM_ACTIVE & state )
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( mCurrentZoomIdx == mTargetZoomIdx )
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGDB("[Goal Reached] Smooth Zoom notify currentIdx = %d, targetIdx = %d",
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             mCurrentZoomIdx,
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             mTargetZoomIdx);
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( NO_ERROR == ret )
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    ret =  BaseCameraAdapter::setState(CAMERA_STOP_SMOOTH_ZOOM);
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    if ( NO_ERROR == ret )
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        ret = BaseCameraAdapter::commitState();
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    else
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        {
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        ret |= BaseCameraAdapter::rollbackState();
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                        }
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
199226b496d5cce18e5898383bf479fdd42f2b5abdbTyler Luu                mReturnZoomStatus = false;
200226b496d5cce18e5898383bf479fdd42f2b5abdbTyler Luu                notifyZoomSubscribers(mCurrentZoomIdx, true);
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGDB("[Advancing] Smooth Zoom notify currentIdx = %d, targetIdx = %d",
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             mCurrentZoomIdx,
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                             mTargetZoomIdx);
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                notifyZoomSubscribers(mCurrentZoomIdx, false);
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( (mCurrentZoomIdx == mTargetZoomIdx ) &&
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev              ( ZOOM_ACTIVE & state ) )
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2141c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman            ret = BaseCameraAdapter::setState(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM);
2151c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman
2161c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman            if ( NO_ERROR == ret )
2171c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman                {
2181c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman                ret = BaseCameraAdapter::commitState();
2191c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman                }
2201c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman            else
2211c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman                {
2221c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman                ret |= BaseCameraAdapter::rollbackState();
2231c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman                }
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2271c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman    if(mZoomUpdate) {
2281c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman        doZoom(mTargetZoomIdx);
2291c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman        mZoomUpdate = false;
2301c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman        mZoomUpdating = true;
2311c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman    } else {
2321c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman        mZoomUpdating = false;
2331c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman    }
2341c7383822ebd9f8e70d7eec6dd204bb691d29c47Sundar Raman
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::startSmoothZoom(int targetIdx)
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mZoomLock);
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Start smooth zoom target = %d, mCurrentIdx = %d",
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 targetIdx,
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mCurrentZoomIdx);
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( targetIdx >= 0 ) && ( targetIdx < ZOOM_STAGES ) )
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mTargetZoomIdx = targetIdx;
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mZoomParameterIdx = mCurrentZoomIdx;
254226b496d5cce18e5898383bf479fdd42f2b5abdbTyler Luu        mReturnZoomStatus = false;
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEB("Smooth value out of range %d!", targetIdx);
259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t OMXCameraAdapter::stopSmoothZoom()
268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mZoomLock);
271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mTargetZoomIdx != mCurrentZoomIdx )
275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2764fb9d8de9fd6e78637332886ab93b7da9bb6981dSundar Raman        if ( mCurrentZoomIdx < mTargetZoomIdx )
2774fb9d8de9fd6e78637332886ab93b7da9bb6981dSundar Raman            {
2784fb9d8de9fd6e78637332886ab93b7da9bb6981dSundar Raman            mZoomInc = 1;
2794fb9d8de9fd6e78637332886ab93b7da9bb6981dSundar Raman            }
2804fb9d8de9fd6e78637332886ab93b7da9bb6981dSundar Raman        else
2814fb9d8de9fd6e78637332886ab93b7da9bb6981dSundar Raman            {
2824fb9d8de9fd6e78637332886ab93b7da9bb6981dSundar Raman            mZoomInc = -1;
2834fb9d8de9fd6e78637332886ab93b7da9bb6981dSundar Raman            }
2844fb9d8de9fd6e78637332886ab93b7da9bb6981dSundar Raman        mReturnZoomStatus = true;
285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mReturnZoomStatus = true;
286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Stop smooth zoom mCurrentZoomIdx = %d, mTargetZoomIdx = %d",
287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     mCurrentZoomIdx,
288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                     mTargetZoomIdx);
289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
297