CameraHal.cpp revision 72b0d2814165e633385bd87a838fc9c3a8250113
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 CameraHal.cpp
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This file maps the Camera Hardware Interface to V4L2.
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_TAG "CameraHAL"
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h"
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "ANativeWindowDisplayAdapter.h"
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "TICameraParameters.h"
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraProperties.h"
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <cutils/properties.h>
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <poll.h>
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <math.h>
34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android {
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
379a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luuextern "C" CameraAdapter* CameraAdapter_Factory(size_t);
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*****************************************************************************/
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev////Constant definitions and declarations
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev////@todo Have a CameraProperties class to store these parameters as constants for every camera
43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev////       Currently, they are hard-coded
44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst int CameraHal::NO_BUFFERS_PREVIEW = MAX_CAMERA_BUFFERS;
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst int CameraHal::NO_BUFFERS_IMAGE_CAPTURE = 2;
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst uint32_t MessageNotifier::EVENT_BIT_FIELD_POSITION = 0;
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst uint32_t MessageNotifier::FRAME_BIT_FIELD_POSITION = 0;
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************************************************************/
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartPreview;
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartFocus;
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartCapture;
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void orientation_cb(uint32_t orientation, uint32_t tilt, void* cookie) {
62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHal *camera = NULL;
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (cookie) {
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera = (CameraHal*) cookie;
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera->onOrientationEvent(orientation, tilt);
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Interface Method definitions STARTS here--------------------*/
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  Callback function to receive orientation events from SensorListener
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::onOrientationEvent(uint32_t orientation, uint32_t tilt) {
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->onOrientationEvent(orientation, tilt);
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the notification and data callbacks
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] notify_cb Notify callback for notifying the app about events and errors
89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] data_cb   Buffer callback for sending the preview/raw frames to the app
90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] data_cb_timestamp Buffer callback for sending the video frames w/ timestamp
91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] user  Callback cookie
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::setCallbacks(camera_notify_callback notify_cb,
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            camera_data_callback data_cb,
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            camera_data_timestamp_callback data_cb_timestamp,
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            camera_request_memory get_memory,
99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            void *user)
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mAppCallbackNotifier.get() )
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mAppCallbackNotifier->setCallbacks(this,
106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                notify_cb,
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                data_cb,
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                data_cb_timestamp,
109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                get_memory,
110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                user);
111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Enable a message, or set of messages.
118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] msgtype Bitmask of the messages to enable (defined in include/ui/Camera.h)
120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::enableMsgType(int32_t msgType)
124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( msgType & CAMERA_MSG_SHUTTER ) && ( !mShutterEnabled ) )
128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        msgType &= ~CAMERA_MSG_SHUTTER;
130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMsgEnabled |= msgType;
135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayPaused)
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Preview currently paused...will enable preview callback when restarted");
142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            msgType &= ~CAMERA_MSG_PREVIEW_FRAME;
143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }else
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Enabling Preview Callback");
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Preview callback not enabled %x", msgType);
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Configure app callback notifier with the message callback required
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->enableMsgType (msgType);
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Disable a message, or set of messages.
162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] msgtype Bitmask of the messages to disable (defined in include/ui/Camera.h)
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::disableMsgType(int32_t msgType)
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        Mutex::Autolock lock(mLock);
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mMsgEnabled &= ~msgType;
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( msgType & CAMERA_MSG_PREVIEW_FRAME)
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Disabling Preview Callback");
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Configure app callback notifier
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->disableMsgType (msgType);
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Query whether a message, or a set of messages, is enabled.
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Note that this is operates as an AND, if any of the messages queried are off, this will
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   return false.
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] msgtype Bitmask of the messages to query (defined in include/ui/Camera.h)
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If all message types are enabled
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          false If any message type
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::msgTypeEnabled(int32_t msgType)
199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return (mMsgEnabled & msgType);
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters.
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] params Camera parameters to configure the camera
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::setParameters(const char* parameters)
215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   LOG_FUNCTION_NAME;
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters params;
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    String8 str_params(parameters);
222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.unflatten(str_params);
223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return setParameters(params);
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters.
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] params Camera parameters to configure the camera
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::setParameters(const CameraParameters& params)
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   LOG_FUNCTION_NAME;
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w_orig, h_orig;
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int framerate,minframerate;
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int maxFPS, minFPS;
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int error;
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int base;
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *prevFormat;
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *af_coord;
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    TIUTILS::Message msg;
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
253b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Needed for KEY_RECORDING_HINT
254b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
255f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    bool updateRequired = false;
256b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    CameraParameters oldParams(mParameters.flatten());
257381ec2390c3d9d6ba3b67cf53e69fec96e7a7bd1Akwasi Boateng    bool videoMode = false;
258524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman    char range[MAX_PROP_VALUE_LENGTH];
259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
260b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    {
261b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        Mutex::Autolock lock(mLock);
262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
263b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Ensure that preview is not enabled when the below parameters are changed.
264b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(!previewEnabled())
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
267b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("PreviewFormat %s", params.getPreviewFormat());
268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2693a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ((valstr = params.getPreviewFormat()) != NULL) {
2703a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS))) {
2713a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    mParameters.setPreviewFormat(valstr);
2723a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                } else {
2733a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    CAMHAL_LOGEB("Invalid preview format.Supported: %s",  mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
2743a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    return -EINVAL;
275b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
2763a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
277b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
278f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((valstr = params.get(TICameraParameters::KEY_VNF)) != NULL) {
279f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                if ( (params.getInt(TICameraParameters::KEY_VNF)==0) || (params.getInt(TICameraParameters::KEY_VNF)==1) ) {
280f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGDB("VNF set %s", params.get(TICameraParameters::KEY_VNF));
281f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    mParameters.set(TICameraParameters::KEY_VNF, valstr);
282f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                } else {
283f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid VNF: %s", valstr);
284f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    ret = -EINVAL;
285b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
286f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
287b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
288f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((valstr = params.get(TICameraParameters::KEY_VSTAB)) != NULL) {
289f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                if ((params.getInt(TICameraParameters::KEY_VSTAB)==0) || (params.getInt(TICameraParameters::KEY_VSTAB)==1)) {
290f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGDB("VSTAB set %s", params.get(TICameraParameters::KEY_VSTAB));
291f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    mParameters.set(TICameraParameters::KEY_VSTAB, valstr);
292f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                } else {
293f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid VSTAB: %s", valstr);
294f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    ret = -EINVAL;
295b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
296f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
297b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
298b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL)
299b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
300b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Capture mode set %s", params.get(TICameraParameters::KEY_CAP_MODE));
301b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_CAP_MODE, valstr);
302b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
303b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
304f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((valstr = params.get(TICameraParameters::KEY_IPP)) != NULL) {
305f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES))) {
306f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGDB("IPP mode set %s", params.get(TICameraParameters::KEY_IPP));
307f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    mParameters.set(TICameraParameters::KEY_IPP, valstr);
308f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                } else {
309f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid IPP mode: %s", valstr);
310f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    ret = -EINVAL;
311b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
312f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
313b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
314b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if((valstr = params.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL)
315b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
316b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Stereo 3D->2D Preview mode is %s", params.get(TICameraParameters::KEY_S3D2D_PREVIEW));
317b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_S3D2D_PREVIEW, valstr);
318b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
319b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
320b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if((valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL)
321b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
322b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("AutoConvergence mode is %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE));
323b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr);
324b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
325b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
326b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
327b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
3283a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu        //CTS requirement, we should be able to change the preview resolution
3293a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu        //while in paused display state
3303a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu        if ( !previewEnabled() || mDisplayPaused )
3313a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            {
3323a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            params.getPreviewSize(&w, &h);
3333a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if (w == -1 && h == -1) {
3343a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEA("Unable to get preview size");
3353a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                return -EINVAL;
3363a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              }
3373a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3383a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            int oldWidth, oldHeight;
3393a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            mParameters.getPreviewSize(&oldWidth, &oldHeight);
3403a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3413a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            int orientation =0;
3423a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if((valstr = params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)) != NULL)
3433a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3443a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGDB("Sensor Orientation is set to %s", params.get(TICameraParameters::KEY_SENSOR_ORIENTATION));
3453a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.set(TICameraParameters::KEY_SENSOR_ORIENTATION, valstr);
3463a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                orientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION);
3473a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3483a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3493a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if(orientation ==90 || orientation ==270)
3503a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           {
3513a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              if ( !isResolutionValid(h,w, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
3523a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               {
3533a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
3543a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                return -EINVAL;
3553a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               }
3563a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              else
3573a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              {
3583a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.setPreviewSize(w, h);
35972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoWidth = w;
36072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoHeight = h;
3613a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               }
3623a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           }
3633a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           else
3643a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           {
3653a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ( !isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
3663a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3673a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
3683a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                return -EINVAL;
3693a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3703a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            else
3713a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3723a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.setPreviewSize(w, h);
3733a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3743a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           }
3753a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3763a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ( ( oldWidth != w ) || ( oldHeight != h ) )
3773a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3783a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mDynamicPreviewSwitch = true;
3793a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3803a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3813a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            CAMHAL_LOGDB("PreviewResolution by App %d x %d", w, h);
3823a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
3833a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
384b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
385b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        valstr = params.get(CameraParameters::KEY_RECORDING_HINT);
386b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(valstr != NULL)
387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
388b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if(strcmp(valstr, CameraParameters::TRUE) == 0)
389b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
390b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
391b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
392b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                restartPreviewRequired = setVideoModeParameters();
393381ec2390c3d9d6ba3b67cf53e69fec96e7a7bd1Akwasi Boateng                videoMode = true;
39472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                int w, h;
39572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
39672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                params.getPreviewSize(&w, &h);
39772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Preview Width=%d Height=%d\n", __FUNCTION__, w, h);
39872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                //HACK FOR MMS
39972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoWidth = w;
40072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoHeight = h;
40172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Video Width=%d Height=%d\n", __FUNCTION__, mVideoWidth, mVideoHeight);
40272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
40372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                setPreferredPreviewRes(w, h);
40472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mParameters.getPreviewSize(&w, &h);
40572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Preview Width=%d Height=%d\n", __FUNCTION__, w, h);
40672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
407b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
408b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else if(strcmp(valstr, CameraParameters::FALSE) == 0)
409b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
410b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
411b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
412b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                restartPreviewRequired = resetVideoModeParameters();
41372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                params.getPreviewSize(&mVideoWidth, &mVideoHeight);
414b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
415b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
416b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
417b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGEA("Invalid RECORDING_HINT");
418b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                return -EINVAL;
419b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
423b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // This check is required in following case.
424b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // If VideoRecording activity sets KEY_RECORDING_HINT to TRUE and
425b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // ImageCapture activity doesnot set KEY_RECORDING_HINT to FALSE (i.e. simply NULL),
426b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // then Video Mode parameters may remain present in ImageCapture activity as well.
427b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Recording Hint is set to NULL");
428b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_RECORDING_HINT, "");
429b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            restartPreviewRequired = resetVideoModeParameters();
43072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            params.getPreviewSize(&mVideoWidth, &mVideoHeight);
431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
433b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Below parameters can be changed when the preview is running
434f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ( (valstr = params.getPictureFormat()) != NULL ) {
435f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(params.getPictureFormat(),mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) {
436f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.setPictureFormat(valstr);
437f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
438f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr);
439f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
443b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        params.getPictureSize(&w, &h);
444f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ( isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES))) {
445b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.setPictureSize(w, h);
446f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        } else {
447f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            CAMHAL_LOGEB("ERROR: Invalid picture resolution %dx%d", w, h);
448f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            ret = -EINVAL;
449f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
451b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Picture Size by App %d x %d", w, h);
452b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
453f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) {
454f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BURST) >=0) {
455f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Burst set %s", params.get(TICameraParameters::KEY_BURST));
456f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BURST, valstr);
457f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
458f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr);
459f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
461f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
463b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        framerate = params.getPreviewFrameRate();
464524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        valstr = params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
465b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("FRAMERATE %d", framerate);
466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
467524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGVB("Passed FRR: %s, Supported FRR %s", valstr
468524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
469524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGVB("Passed FR: %d, Supported FR %s", framerate
470524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
471524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
472524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
473524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        //Perform parameter validation
474524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if(!isParameterValid(valstr
475524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))
476524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        || !isParameterValid(framerate,
477524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                                      mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES)))
478524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        {
479524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("Invalid frame rate range or frame rate");
480524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            return -EINVAL;
481524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        }
482524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
4831521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // Variable framerate ranges have higher priority over
4841521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // deprecated constant FPS. "KEY_PREVIEW_FPS_RANGE" should
4851521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // be cleared by the client in order for constant FPS to get
4861521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // applied.
487524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( strcmp(valstr, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE))  != 0)
488a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
489524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            // APP wants to set FPS range
490524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            //Set framerate = MAXFPS
491524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGDA("APP IS CHANGING FRAME RATE RANGE");
492b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            params.getPreviewFpsRange(&minFPS, &maxFPS);
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
494b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( ( 0 > minFPS ) || ( 0 > maxFPS ) )
495a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              {
496f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEA("ERROR: FPS Range is negative!");
497524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                return -EINVAL;
498a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              }
499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
500524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            framerate = maxFPS /CameraHal::VFR_SCALE;
501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
502524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          }
503524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        else
504524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          {
505524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman              if ( framerate != atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)) )
506a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              {
507d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman
508524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                selectFPSRange(framerate, &minFPS, &maxFPS);
509d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman                CAMHAL_LOGDB("Select FPS Range %d %d", minFPS, maxFPS);
510a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              }
511524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman              else
512524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                {
513524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    if (videoMode) {
514524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_VIDEO);
515524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        CameraParameters temp;
516524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
517524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
518524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    }
519524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    else {
520524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_IMAGE);
521524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        CameraParameters temp;
522524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
523524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
524524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    }
525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
526524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    framerate = maxFPS / CameraHal::VFR_SCALE;
527524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                }
528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
529524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          }
530a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
531524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("FPS Range = %s", valstr);
532524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("DEFAULT FPS Range = %s", mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
534524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        minFPS /= CameraHal::VFR_SCALE;
535524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        maxFPS /= CameraHal::VFR_SCALE;
536524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
537524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( ( 0 == minFPS ) || ( 0 == maxFPS ) )
538a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
539524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("ERROR: FPS Range is invalid!");
540524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            ret = -EINVAL;
541a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          }
542524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
543524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( maxFPS < minFPS )
544a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
545524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("ERROR: Max FPS is smaller than Min FPS!");
546524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            ret = -EINVAL;
547a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          }
548524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
549524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.setPreviewFrameRate(framerate);
55008bd593a76c52f567ab844a9d92a9ffa2fe47ee9Sundar Raman        mParameters.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE));
551524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
552524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("FPS Range [%d, %d]", minFPS, maxFPS);
553524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.set(TICameraParameters::KEY_MINFRAMERATE, minFPS);
554524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.set(TICameraParameters::KEY_MAXFRAMERATE, maxFPS);
555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
556b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( valstr = params.get(TICameraParameters::KEY_GBCE) ) != NULL )
557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
558b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GBCE Value = %s", valstr);
559b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GBCE, valstr);
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
562b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( valstr = params.get(TICameraParameters::KEY_GLBCE) ) != NULL )
563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
564b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GLBCE Value = %s", valstr);
565b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GLBCE, valstr);
566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
568b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Update the current parameter set
569b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL)
570b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
571b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("AutoConvergence Mode is set = %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE));
572b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr);
5731521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu            }
574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
575b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES)) !=NULL )
576b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
577b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("ManualConvergence Value = %s", params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES));
578b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, valstr);
579b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
581f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_EXPOSURE_MODE)) != NULL) {
582f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES))) {
583f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Exposure set = %s", valstr);
584f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr);
585f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
586f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Exposure  = %s", valstr);
587f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
588b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
589f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
591f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_WHITE_BALANCE)) != NULL) {
592f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu           if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) {
593f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGDB("White balance set %s", valstr);
594f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               mParameters.set(CameraParameters::KEY_WHITE_BALANCE, valstr);
595f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
596f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGEB("ERROR: Invalid white balance  = %s", valstr);
597f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               ret = -EINVAL;
598b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
599f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
601f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) {
602f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) {
603f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Contrast set %s", valstr);
604f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_CONTRAST, valstr);
605f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
606f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Contrast  = %s", valstr);
607f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
608b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
609f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
611f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr =params.get(TICameraParameters::KEY_SHARPNESS)) != NULL) {
612f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SHARPNESS) >= 0 ) {
613f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Sharpness set %s", valstr);
614f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr);
615f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
616f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr);
617f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
618b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
619f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
621f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_SATURATION)) != NULL) {
622f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SATURATION) >= 0 ) {
623f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Saturation set %s", valstr);
624f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SATURATION, valstr);
625f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
626f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr);
627f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
628b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
629f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
631f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BRIGHTNESS)) != NULL) {
632f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BRIGHTNESS) >= 0 ) {
633f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Brightness set %s", valstr);
634f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr);
635f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
636f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr);
637f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
638f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
639f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
640f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu
641f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_ANTIBANDING)) != NULL) {
642f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) {
643f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Antibanding set %s", valstr);
644f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_ANTIBANDING, valstr);
645f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
646f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr);
647f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
648f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
649f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
650f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu
651f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) {
652f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) {
653f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("ISO set %s", valstr);
654f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_ISO, valstr);
655f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
656f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr);
657f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
658b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
659f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
661f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) {
662f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) {
663f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Focus mode set %s", params.get(CameraParameters::KEY_FOCUS_MODE));
664f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_FOCUS_MODE, valstr);
665f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
666f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr);
667f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
668f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
669f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
671b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_FOCUS_AREAS)) != NULL )
672b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
673b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGEB("Focus areas position set %s", params.get(CameraParameters::KEY_FOCUS_AREAS));
674b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_FOCUS_AREAS, valstr);
675b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
677b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL )
678b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
679b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Measurements set to %s", params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE));
680b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_MEASUREMENT_ENABLE, valstr);
681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
682b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_ENABLE) == 0)
683b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
684b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = true;
685b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
686b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_DISABLE) == 0)
687b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
688b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
689b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
690b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
691b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
692b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
693b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
695b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
697b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL)
698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
699b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Exposure compensation set %s", params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION));
700b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr);
701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
702b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
703f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_SCENE_MODE)) != NULL) {
704f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES))) {
705f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Scene mode set %s", valstr);
706f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_SCENE_MODE, valstr);
707f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
708f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr);
709f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
711f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
712b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
713f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_FLASH_MODE)) != NULL) {
714f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES))) {
715f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Flash mode set %s", valstr);
716f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_FLASH_MODE, valstr);
717f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
718f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr);
719f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
721f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
723f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_EFFECT)) != NULL) {
724f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS))) {
725f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Effect set %s", valstr);
726f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_EFFECT, valstr);
727f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
728f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr);
729f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
730f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
731f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
733b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_ROTATION)) != NULL)
734b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_ROTATION) >=0))
735b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
736b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Rotation set %s", params.get(CameraParameters::KEY_ROTATION));
737b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_ROTATION, valstr);
738b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
740b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_QUALITY)) != NULL)
741b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_QUALITY) >=0))
742b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
743b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Jpeg quality set %s", params.get(CameraParameters::KEY_JPEG_QUALITY));
744b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_QUALITY, valstr);
745b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
747b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH)) != NULL)
748b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH) >=0))
749b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
750b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH));
751b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, valstr);
752b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
754b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT)) != NULL)
755b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT) >=0))
756b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
757b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT));
758b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, valstr);
759b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
761b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY)) != NULL )
762b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY) >=0))
763b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
764b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail quality set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY));
765b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, valstr);
766b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
768b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_LATITUDE)) != NULL )
769b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
770b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS latitude set %s", params.get(CameraParameters::KEY_GPS_LATITUDE));
771b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_LATITUDE, valstr);
772b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
773b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_LATITUDE);
774b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
776b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_LONGITUDE)) != NULL )
777b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
778b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS longitude set %s", params.get(CameraParameters::KEY_GPS_LONGITUDE));
779b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_LONGITUDE, valstr);
780b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
781b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_LONGITUDE);
782b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
784b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_ALTITUDE)) != NULL )
785b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
786b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS altitude set %s", params.get(CameraParameters::KEY_GPS_ALTITUDE));
787b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_ALTITUDE, valstr);
788b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
789b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_ALTITUDE);
790b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
792b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_TIMESTAMP)) != NULL )
793b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
794b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS timestamp set %s", params.get(CameraParameters::KEY_GPS_TIMESTAMP));
795b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_TIMESTAMP, valstr);
796b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
797b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_TIMESTAMP);
798b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
800b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL )
801b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
802b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS datestamp set %s", params.get(TICameraParameters::KEY_GPS_DATESTAMP));
803b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr);
804b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
805b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP);
806b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
808b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL )
809b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
810b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS processing method set %s", params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD));
811b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr);
812b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
813b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD);
814b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
816b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL )
817b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
818b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_MAPDATUM));
819b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr);
820b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
821b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM);
822b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
824b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL )
825b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
826b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_VERSION));
827b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr);
828b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
829b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_VERSION);
830b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
832b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL )
833b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
834b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("EXIF Model set %s", params.get(TICameraParameters::KEY_EXIF_MODEL));
835b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr);
836b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
838b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL )
839b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
840b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("EXIF Make set %s", params.get(TICameraParameters::KEY_EXIF_MAKE));
841b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr);
842b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
844b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL )
845b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
846b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE));
847b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valstr);
848b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
849b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else
850b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
851b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
852b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
854f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_ZOOM)) != NULL ) {
855f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((params.getInt(CameraParameters::KEY_ZOOM) >= 0 ) &&
856f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                (params.getInt(CameraParameters::KEY_ZOOM) <= mMaxZoomSupported )) {
857f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Zoom set %s", valstr);
858f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                doesSetParameterNeedUpdate(valstr,
859f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                           mParameters.get(CameraParameters::KEY_ZOOM),
860f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                           updateRequired);
861f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_ZOOM, valstr);
862f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
863f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr);
864f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
865b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
866f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
868b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL )
869b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
870b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Auto Exposure Lock set %s", params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
871f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
872f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       mParameters.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK),
873f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
874b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr);
875b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
877b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL )
878b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
879b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
880f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
881f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       mParameters.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK),
882f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
883b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr);
884b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
885708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        if( (valstr = params.get(CameraParameters::KEY_METERING_AREAS)) != NULL )
886708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            {
887708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            CAMHAL_LOGEB("Metering areas position set %s", params.get(CameraParameters::KEY_METERING_AREAS));
888708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            mParameters.set(CameraParameters::KEY_METERING_AREAS, valstr);
889708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            }
890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
891b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CameraParameters adapterParams = mParameters;
892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
893b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        // Only send parameters to adapter if preview is already
894f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter,
895f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // will be called in startPreview()
896f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // TODO(XXX): Need to identify other parameters that need update from camera adapter
897f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        if ( (NULL != mCameraAdapter) && (mPreviewEnabled || updateRequired) ) {
898b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ret |= mCameraAdapter->setParameters(adapterParams);
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
901b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) )
902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
903b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS);
904b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( 0 < posBracketRange )
905b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
906b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketRangePositive = posBracketRange;
907b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
909b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Positive bracketing range %d", mBracketRangePositive);
910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
912b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG) )
913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
914b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            int negBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG);
915b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( 0 < negBracketRange )
916b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
917b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketRangeNegative = negBracketRange;
918b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
920b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Negative bracketing range %d", mBracketRangeNegative);
921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
922b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL) &&
923b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::BRACKET_ENABLE) == 0 ))
924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
925b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( !mBracketingEnabled )
926b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
927b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Enabling bracketing");
928b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketingEnabled = true;
929b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
930b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                //Wait for AF events to enable bracketing
931b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                if ( NULL != mCameraAdapter )
932b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    {
933b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    setEventProvider( CameraHalEvent::ALL_EVENTS, mCameraAdapter );
934b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    }
935b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
936b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
938b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Bracketing already enabled");
939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
941b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else if ( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL ) &&
942b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::BRACKET_DISABLE) == 0 ))
943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
944b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling bracketing");
945b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
946b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mBracketingEnabled = false;
947b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            stopImageBracketing();
948b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
949b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            //Remove AF events subscription
950b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( NULL != mEventProvider )
951b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
952b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mEventProvider->disableEventNotification( CameraHalEvent::ALL_EVENTS );
953b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                delete mEventProvider;
954b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mEventProvider = NULL;
955b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
956b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
959b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
960b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::SHUTTER_ENABLE) == 0 ))
961b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
962b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Enabling shutter sound");
963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
964b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = true;
965b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled |= CAMERA_MSG_SHUTTER;
966b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
967b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
968b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else if ( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
969b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::SHUTTER_DISABLE) == 0 ))
970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
971b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling shutter sound");
972b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
973b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = false;
974b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled &= ~CAMERA_MSG_SHUTTER;
975b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
978b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
980b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    //On fail restore old parameters
981b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    if ( NO_ERROR != ret ) {
982b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman        mParameters.unflatten(oldParams.flatten());
983b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    }
984b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman
985b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running.
986b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // If preview is not started yet, Video Mode parameters will take effect on next startPreview()
987b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if(restartPreviewRequired && previewEnabled())
988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
989b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Restarting Preview as needed by KEY_RECODING_HINT");
990b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ret = restartPreview();
991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
992b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if (ret != NO_ERROR)
993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
994b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGEA("Failed to restart Preview");
995b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        return ret;
996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1001b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        unsigned int buffercount, unsigned int &max_queueable)
1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() == NULL)
1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Memory allocation of preview buffers is now placed in gralloc
1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // CameraHal should not allocate preview buffers without DisplayAdapter
1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mPreviewBufs)
1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///@todo Pluralise the name of this method to allocateBuffers
1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewLength = 0;
1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewBufs = (int32_t *) mDisplayAdapter->allocateBuffer(width, height,
1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    previewFormat,
1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    mPreviewLength,
1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    buffercount);
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (NULL == mPreviewBufs ) {
1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview buffers");
1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_MEMORY;
1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets();
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == mPreviewOffsets ) {
1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Buffer mapping failed");
1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return BAD_VALUE;
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewFd = mDisplayAdapter->getFd();
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( -1 == mPreviewFd ) {
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Invalid handle");
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return BAD_VALUE;
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          }
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBufProvider = (BufferProvider*) mDisplayAdapter.get();
1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->maxQueueableBuffers(max_queueable);
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (ret != NO_ERROR) {
1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewBufs()
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("mPreviewBufs = 0x%x", (unsigned int)mPreviewBufs);
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mPreviewBufs)
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///@todo Pluralise the name of this method to freeBuffers
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mBufProvider->freeBuffer(mPreviewBufs);
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewBufs = NULL;
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount)
1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int bytes;
1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bytes = size;
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mPreviewDataBufs )
1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = freePreviewDataBufs();
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1096c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman        bytes = ((bytes+4095)/4096)*4096;
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, NULL, bytes, bufferCount);
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes);
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL == mPreviewDataBufs )
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -NO_MEMORY;
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes = size;
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = mMemoryManager->getFd();
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = bytes;
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = mMemoryManager->getOffsets();
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = -1;
1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = 0;
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = NULL;
1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewDataBufs()
1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mPreviewDataBufs )
1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@todo Pluralise the name of this method to freeBuffers
1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mMemoryManager->freeBuffer(mPreviewDataBufs);
1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mPreviewDataBufs = NULL;
1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size, const char* previewFormat, unsigned int bufferCount)
1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int bytes;
1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bytes = size;
1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Always allocate the buffers for image capture using MemoryManager
1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL != mImageBufs ) )
1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = freeImageBufs();
1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1173c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman        bytes = ((bytes+4095)/4096)*4096;
1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, previewFormat, bytes, bufferCount);
1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes);
1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL == mImageBufs )
1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -NO_MEMORY;
1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes = size;
1185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = mMemoryManager->getFd();
1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = bytes;
1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = mMemoryManager->getOffsets();
1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = -1;
1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = 0;
1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = NULL;
1199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
120672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengstatus_t CameraHal::allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount)
120772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
120872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  status_t ret = NO_ERROR;
120972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
121072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
121172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if( NULL != mVideoBufs ){
121272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    ret = freeVideoBufs(mVideoBufs);
121372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoBufs = NULL;
121472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
121572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
121672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( NO_ERROR == ret ){
121772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    int32_t stride;
121872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    buffer_handle_t *bufsArr = new buffer_handle_t [bufferCount];
121972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
122072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if (bufsArr != NULL){
122172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      for (int i = 0; i< bufferCount; i++){
122272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        GraphicBufferAllocator &GrallocAlloc = GraphicBufferAllocator::get();
122372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        buffer_handle_t buf;
122472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        ret = GrallocAlloc.alloc(width, height, HAL_PIXEL_FORMAT_NV12, CAMHAL_GRALLOC_USAGE, &buf, &stride);
122572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if (ret != NO_ERROR){
122672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          CAMHAL_LOGEA("Couldn't allocate video buffers using Gralloc");
122772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          ret = -NO_MEMORY;
122872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          for (int j=0; j< i; j++){
122972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            buf = (buffer_handle_t)bufsArr[j];
123072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            CAMHAL_LOGEB("Freeing Gralloc Buffer 0x%x", buf);
123172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            GrallocAlloc.free(buf);
123272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
123372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          delete [] bufsArr;
123472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          goto exit;
123572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        }
123672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        bufsArr[i] = buf;
123772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGVB("*** Gralloc Handle =0x%x ***", buf);
123872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
123972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
124072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      mVideoBufs = (int32_t *)bufsArr;
124172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
124272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    else{
124372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      CAMHAL_LOGEA("Couldn't allocate video buffers ");
124472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      ret = -NO_MEMORY;
124572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
124672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
124772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
124872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng exit:
124972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
125072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
125172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  return ret;
125272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
125372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
1254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid endImageCapture( void *userData)
1255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != userData )
1259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->signalEndImageCapture();
1262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid releaseImageBuffers(void *userData)
1268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1271de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman// Make releaseImageBuffers a no-op for now because it is racing against AppCallbackNotifier
1272de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman// in the home screen use-case. Image capture buffers are anyways reallocated on subsequent
1273de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman// captures and also released as part of final camera hal cleanup
1274de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman#if 0
1275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != userData )
1276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->freeImageBufs();
1279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1280de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman#endif
1281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::signalEndImageCapture()
1286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w,h;
1289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters adapterParams = mParameters;
1290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
1291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
1295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freeImageBufs()
1302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mImageBufs )
1311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@todo Pluralise the name of this method to freeBuffers
1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mMemoryManager->freeBuffer(mImageBufs);
1315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mImageBufs = NULL;
1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
133072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengstatus_t CameraHal::freeVideoBufs(void *bufs)
133172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
133272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  status_t ret = NO_ERROR;
1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
133472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
133572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
133672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  buffer_handle_t *pBuf = (buffer_handle_t*)bufs;
133772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
133872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if(pBuf == NULL)
133972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    {
134072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      CAMHAL_LOGEA("NULL pointer passed to freeVideoBuffer");
134172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      LOG_FUNCTION_NAME_EXIT;
134272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      return BAD_VALUE;
134372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
134472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
134572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  GraphicBufferAllocator &GrallocAlloc = GraphicBufferAllocator::get();
134672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
134772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  for(int i = 0; i < count; i++){
134872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    buffer_handle_t ptr = *pBuf++;
134972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    CAMHAL_LOGVB("Free Video Gralloc Handle 0x%x", ptr);
135072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    GrallocAlloc.free(ptr);
135172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
135272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
135372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
135472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
135572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  return ret;
135672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start preview mode.
1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Camera switched to VF mode
1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update function header with the different errors that are possible
1364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startPreview()
1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
1371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
1372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int required_buffer_count;
1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int max_queueble_buffers;
1375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartPreview, NULL);
1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1384e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    if ( mPreviewEnabled )
1385e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    {
1386e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    CAMHAL_LOGDA("Preview already running");
1387e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1388e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    LOG_FUNCTION_NAME_EXIT;
1389e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1390e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    return ALREADY_EXISTS;
1391e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1392e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1393e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    if ( NULL != mCameraAdapter ) {
1394e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
13955950d86f5e3d119cb024ae3989a643571dd81794Sundar Raman        ret = mCameraAdapter->setParameters(mParameters);
1396e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1397e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1398e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    ///If we don't have the preview callback enabled and display adapter,
1399e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL))
1400e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    {
1401e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman        CAMHAL_LOGEA("Preview not started. Preview in progress flag set");
1402e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman        mPreviewStartInProgress = true;
1403e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman        return NO_ERROR;
1404e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1405e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) )
1407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Preview is in paused state");
1409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayPaused = false;
1411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewEnabled = true;
1412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
1415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
1417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("Display adapter resume failed %x", ret);
1419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //restart preview callbacks
1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME);
1425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
14263a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu        if ( mDynamicPreviewSwitch )
14273a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            {
14283a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            forceStopPreview();
14293a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            mDynamicPreviewSwitch = false;
14303a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
14313a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu        else
14323a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            {
14333a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            return ret;
14343a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Ensure that buffers for preview are allocated before we start the camera
1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Get the updated size from Camera Adapter, to account for padding etc
1439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW,
1440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                      ( int ) &frame);
1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR != ret )
1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Update the current preview width and height
1447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewWidth = frame.mWidth;
1448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewHeight = frame.mHeight;
1449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Update the padded width and height - required for VNF and VSTAB
1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mParameters.set(TICameraParameters::KEY_PADDED_WIDTH, mPreviewWidth);
1452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mParameters.set(TICameraParameters::KEY_PADDED_HEIGHT, mPreviewHeight);
1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Allocate the preview buffers
1457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = allocPreviewBufs(frame.mWidth, frame.mHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
1458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR != ret )
1460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't allocate buffers for Preview");
1462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mMeasurementEnabled )
1466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA,
1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          ( int ) &frame,
1470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          required_buffer_count);
1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
1472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ///Allocate the preview data buffers
1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = allocPreviewDataBufs(frame.mLength, required_buffer_count);
1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret ) {
1479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview data buffers");
1480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto error;
1481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev           }
1482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mPreviewDataBufs;
1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mPreviewDataOffsets;
1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mPreviewDataFd;
1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mPreviewDataLength;
1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) required_buffer_count;
1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = (size_t) required_buffer_count;
1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA,
1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        ( int ) &desc);
1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Pass the buffers to Camera Adapter
1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mBuffers = mPreviewBufs;
1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mOffsets = mPreviewOffsets;
1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mFd = mPreviewFd;
1502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mLength = mPreviewLength;
1503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mCount = ( size_t ) required_buffer_count;
1504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mMaxQueueable = (size_t) max_queueble_buffers;
1505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
15068fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW,
15078fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman                                      ( int ) &desc);
15088fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman
15098fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    if ( NO_ERROR != ret )
15108fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        {
15118fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret);
15128fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        freePreviewBufs();
15138fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        return ret;
15148fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        }
1515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count);
1517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
1519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mAppCallbackNotifier->start();
1520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( ALREADY_EXISTS == ret )
1522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Already running, do nothing
1524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("AppCallbackNotifier already running");
1525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_ERROR;
1526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( NO_ERROR == ret ) {
1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Started AppCallbackNotifier..");
1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
1530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Couldn't start AppCallbackNotifier");
1534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Enable the display adapter if present, actual overlay enable happens when we post the buffer
1538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() != NULL)
1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Enabling display");
1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        bool isS3d = false;
1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        DisplayAdapter::S3DParameters s3dParams;
1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int width, height;
1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mParameters.getPreviewSize(&width, &height);
1545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if 0 //TODO: s3d is not part of bringup...will reenable
1546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_SUPPORTED)) != NULL) {
1547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            isS3d = (strcmp(valstr, "true") == 0);
1548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL) {
1550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (strcmp(valstr, "off") == 0)
1551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS OFF");
1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //TODO: obtain the frame packing configuration from camera or user settings
1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //once side by side configuration is supported
1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.mode = OVERLAY_S3D_MODE_ON;
1556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
1561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS ON");
1563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.mode = OVERLAY_S3D_MODE_OFF;
1564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif //if 0
1570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview, isS3d ? &s3dParams : NULL);
1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->enableDisplay(width, height, NULL, isS3d ? &s3dParams : NULL);
1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( ret != NO_ERROR )
1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't enable display");
1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto error;
1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Send START_PREVIEW command to adapter
1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Starting CameraAdapter preview mode");
1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW);
1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(ret!=NO_ERROR)
1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter");
1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Started preview");
1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = true;
1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStartInProgress = false;
16033f94f2f7a3999272d52653cd82714b7a7d3ae9b9Tyler Luu    mDynamicPreviewSwitch = false;
1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    error:
1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Performing cleanup after error");
1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Do all the cleanup
1611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        freePreviewBufs();
1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayAdapter.get() != NULL)
1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
16156b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng            mDisplayAdapter->disableDisplay(false);
1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stop();
1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewStartInProgress = false;
1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewEnabled = false;
1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Sets ANativeWindow object.
1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it
1629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   to render buffers to display.
1630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] window The ANativeWindow object created by Surface flinger
1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the ANativeWindow object passes validation criteria
1633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
1634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::setPreviewWindow(struct preview_stream_ops *window)
1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
1640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = true;
1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter
1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!window)
1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayAdapter.get() != NULL)
1648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///NULL window passed, destroy the display adapter if present
1650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("NULL window passed, destroying display adapter");
1651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mDisplayAdapter.clear();
1652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client
1653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@remarks so, we will wait until it passes a valid window to begin the preview again
1654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSetPreviewWindowCalled = false;
1655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("NULL ANativeWindow passed to setPreviewWindow");
1657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
1658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }else if(mDisplayAdapter.get() == NULL)
1659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Need to create the display adapter since it has not been created
1661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Create display adapter
1662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter = new ANativeWindowDisplayAdapter();
1663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_ERROR;
1664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR))
1665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if(ret!=NO_ERROR)
1667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mDisplayAdapter.clear();
1669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("DisplayAdapter initialize failed");
1670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                LOG_FUNCTION_NAME_EXIT;
1671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return ret;
1672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
1674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("Couldn't create DisplayAdapter");
1676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                LOG_FUNCTION_NAME_EXIT;
1677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return NO_MEMORY;
1678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // DisplayAdapter needs to know where to get the CameraFrames from inorder to display
1682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter
1683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->setFrameProvider(mCameraAdapter);
1684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Any dynamic errors that happen during the camera use case has to be propagated back to the application
1686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
1687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Set it as the error handler for the DisplayAdapter
1688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get());
1689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Update the display adapter with the new window that is passed from CameraService
1691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret  = mDisplayAdapter->setPreviewWindow(window);
1692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(ret!=NO_ERROR)
1693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
1695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mPreviewStartInProgress)
1698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("setPreviewWindow called when preview running");
1700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            // Start the preview since the window is now available
1701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = startPreview();
1702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }else
1704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /* If mDisplayAdpater is already created. No need to do anything.
1706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         * We get a surface handle directly now, so we can reconfigure surface
1707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         * itself in DisplayAdapter if dimensions have changed
1708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         */
1709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
1719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
1722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopPreview()
1725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled() && !mDisplayPaused)
1729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
1732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17340e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman    bool imageCaptureRunning = (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE) &&
17350e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman                                    (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE);
17360e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman    if(mDisplayPaused && !imageCaptureRunning)
1737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Display is paused, which essentially means there is no preview active.
1739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Note: this is done so that when stopPreview is called by client after
1740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // an image capture, we do not de-initialize the camera adapter and
1741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // restart over again.
174297db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu
1743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
1744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    forceStopPreview();
1747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1748b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Reset Capture-Mode to default, so that when we switch from VideoRecording
1749b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE.
1750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Resetting Capture-Mode to default");
1751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
1752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if preview is enabled
1758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If preview is running currently
1761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If preview has been stopped
1762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::previewEnabled()
1765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return (mPreviewEnabled || mPreviewStartInProgress);
1769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start record mode.
1773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with
1775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  the corresponding frame. Every record frame must be released by calling
1776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  releaseRecordingFrame().
1777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If recording could be started without any issues
1780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update the header with possible error values in failure scenarios
1781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startRecording( )
1784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
1786b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
1787b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
1788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            gettimeofday(&mStartPreview, NULL);
1796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled())
1800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1804b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
1805b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if ( (valstr == NULL) ||
1806b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil         ( (valstr != NULL) && (strcmp(valstr, CameraParameters::TRUE) != 0) ) )
1807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1808b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = setVideoModeParameters();
1809b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1810b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(restartPreviewRequired)
1811b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1812b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ret = restartPreview();
1813b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
181772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      {
181872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
181972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        mParameters.getPreviewSize(&w, &h);
182072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGDB("%s Video Width=%d Height=%d", __FUNCTION__, mVideoWidth, mVideoHeight);
182172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
182272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if ((w != mVideoWidth) && (h != mVideoHeight))
182372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
182472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = allocVideoBufs(mVideoWidth, mVideoHeight, count);
182572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            if ( NO_ERROR != ret )
182672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              {
182772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
182872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                return ret;
182972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              }
183072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
183172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->useVideoBuffers(true);
183272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->setVideoRes(mVideoWidth, mVideoHeight);
183372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, count, mVideoBufs);
183472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
183572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        else
183672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
183772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->useVideoBuffers(false);
183872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->setVideoRes(mPreviewWidth, mPreviewHeight);
183972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, count, NULL);
184072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
184172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
1842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret = mAppCallbackNotifier->startRecording();
1846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter
1851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret =  mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO);
1852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecordingEnabled = true;
1857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters specific to Video Recording.
1866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function checks for the camera parameters which have to be set for recording.
1868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it.
1869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function also enables Video Recording specific functions like VSTAB & VNF.
1870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1872b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Modify the policies for enabling VSTAB & VNF usecase based later.
1874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1876b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilbool CameraHal::setVideoModeParameters()
1877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
1879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool restartPreviewRequired = false;
1880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (valstr == NULL) ||
1887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) ) )
1888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE");
1890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE);
1891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        restartPreviewRequired = true;
1892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1894cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    // Check if CAPTURE_MODE is VIDEO_MODE, since VSTAB & VNF work only in VIDEO_MODE.
1895cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1896cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    if (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0)
1897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1898cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // Enable VSTAB, if not enabled already
1899cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        valstr = mParameters.get(TICameraParameters::KEY_VSTAB);
1900cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        if ( (valstr == NULL) ||
1901cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            ( (valstr != NULL) && (strcmp(valstr, "1") != 0) ) )
1902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1903cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Enable VSTAB");
1904cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VSTAB, "1");
1905cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
1906cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            }
1907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1908cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // Enable VNF, if not enabled already
1909cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        valstr = mParameters.get(TICameraParameters::KEY_VNF);
1910cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        if ( (valstr == NULL) ||
1911cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            ( (valstr != NULL) && (strcmp(valstr, "1") != 0) ) )
1912cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            {
1913cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Enable VNF");
1914cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VNF, "1");
1915cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
1916cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            }
1917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1918cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU.
1919cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048.
1920cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution.
1921cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        valstr = mParameters.get(TICameraParameters::KEY_VSTAB);
1922cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        if ((valstr != NULL) && (strcmp(valstr, "1") == 0) && (mPreviewWidth == 1920))
1923cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            {
1924cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Force Enable VNF for 1080p");
1925cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VNF, "1");
1926cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
1927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1930b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
1931b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1932b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
1933b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
1934b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1935b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
1936b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Reset the camera parameters specific to Video Recording.
1937b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1938b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF.
1939b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1940b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
1941b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1942b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1943b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
1944b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilbool CameraHal::resetVideoModeParameters()
1945b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
1946b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
1947b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
1948b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
1949b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1950b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
1951b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1952d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    // ignore this if we are already recording
1953d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    if (mRecordingEnabled) {
1954d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu        return false;
1955d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    }
1956d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu
1957b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1958b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1959b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0) )
1960b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        {
1961b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Reset Capture-Mode to default");
1962b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
1963b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = true;
1964b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        }
1965b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1966b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Enable VSTAB, if not enabled already
1967b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_VSTAB);
1968b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if (  (valstr != NULL) && (strcmp(valstr, "1") == 0) )
1969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1970b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Disable VSTAB");
1971b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_VSTAB, "0");
1972b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = true;
1973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1975b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Enable VNF, if not enabled already
1976b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_VNF);
1977b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if (  (valstr != NULL) && (strcmp(valstr, "1") == 0) )
1978b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        {
1979b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Disable VNF");
1980b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_VNF, "0");
1981b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = true;
1982b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        }
1983b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1984b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
1985b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1986b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
1987b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
1988b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1989b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
1990b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Restart the preview with setParameter.
1991b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1992b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function restarts preview, for some VIDEO_MODE parameters to take effect.
1993b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1994b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
1995b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return NO_ERROR If recording parameters could be set without any issues
1996b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1997b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
1998b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilstatus_t CameraHal::restartPreview()
1999b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
2000b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
2001b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    char tmpvalstr[30];
2002b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
2003b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2004b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
2005b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2006b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview().
2007b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    tmpvalstr[0] = 0;
2008b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2009b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if(valstr != NULL)
2010b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        {
2011b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(sizeof(tmpvalstr) < (strlen(valstr)+1))
2012b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
2013b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            return -EINVAL;
2014b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
2015b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2016e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman        strncpy(tmpvalstr, valstr, sizeof(tmpvalstr));
2017b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        tmpvalstr[sizeof(tmpvalstr)-1] = 0;
2018b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        }
2019b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2020b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    stopPreview();
2021b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2022b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    {
2023b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        Mutex::Autolock lock(mLock);
2024b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_CAP_MODE, tmpvalstr);
2025b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mCameraAdapter->setParameters(mParameters);
2026b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
2027b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2028b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    ret = startPreview();
2029b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started recording.
2037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopRecording()
2043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
20447d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    CameraAdapter::AdapterState currentState;
20457d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
20487d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    Mutex::Autolock lock(mLock);
20497d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!mRecordingEnabled )
2051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
2053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
20557d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    currentState = mCameraAdapter->getState();
20567d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) {
20577d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
20587d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    }
20597d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->stopRecording();
2061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO);
2063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
2065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
206672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if ( mAppCallbackNotifier->getUesVideoBuffers() ){
206772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      freeVideoBufs(mVideoBufs);
206872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      if (mVideoBufs){
206972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGVB(" FREEING mVideoBufs 0x%x", mVideoBufs);
207072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        delete [] mVideoBufs;
207172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
207272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      mVideoBufs = NULL;
207372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
207472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
2075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if recording is enabled.
2080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If recording is currently running
2083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If recording has been stopped
2084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::recordingEnabled()
2087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mRecordingEnabled;
2093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
2097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers
2099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               previously given by CameraHal
2100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::releaseRecordingFrame(const void* mem)
2104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //CAMHAL_LOGDB(" 0x%x", mem->pointer());
2108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( mRecordingEnabled ) && mem != NULL)
2110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->releaseRecordingFrame(mem);
2112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return;
2117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start auto focus
2121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This call asynchronous.
2123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   The notification callback routine is called with CAMERA_MSG_FOCUS once when
2124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focusing is complete. autoFocus() will be called again if another auto focus is
2125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   needed.
2126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
2129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes if the focus is not locked
2130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::autoFocus()
2133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&mStartFocus, NULL);
2139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter )
2146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //pass the autoFocus timestamp along with the command to camera adapter
2151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus);
2152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS);
2156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
2163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancels auto-focus function.
2172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   If the auto-focus is still in progress, this function will cancel it.
2174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Whether the auto-focus is in progress or not, this function will return the
2175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focus position to the default. If the camera does not support auto-focus, this is a no-op.
2176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the cancel succeeded
2180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if cancel didnt succeed
2181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelAutoFocus()
2184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
2187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
2189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier)
2195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
2200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
2203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
2204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay);
2207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == mEventProvider )
2208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error in creating EventProvider");
2210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->enableEventNotification(eventMask);
2214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallbackRelay(CameraHalEvent* event)
2220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHal *appcbn = ( CameraHal * ) (event->mCookie);
2224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    appcbn->eventCallback(event );
2225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallback(CameraHalEvent* event)
2230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != event )
2234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch( event->mEventType )
2236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CameraHalEvent::EVENT_FOCUS_LOCKED:
2238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CameraHalEvent::EVENT_FOCUS_ERROR:
2239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( mBracketingEnabled )
2241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
2242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    startImageBracketing();
2243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
2244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
2247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
2251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startImageBracketing()
2257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        status_t ret = NO_ERROR;
2259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraFrame frame;
2260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraAdapter::BuffersDescriptor desc;
2261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartCapture, NULL);
2265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
2269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!previewEnabled() && !mDisplayPaused)
2271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            LOG_FUNCTION_NAME_EXIT;
2273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
2274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( !mBracketingEnabled )
2277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
2279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingRunning = true;
2284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &frame,
2290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( mBracketRangeNegative + 1 ));
2291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != mAppCallbackNotifier.get() )
2301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
2303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mParameters.getPictureSize(( int * ) &frame.mWidth,
2309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                       ( int * ) &frame.mHeight);
2310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = allocImageBufs(frame.mWidth,
2312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mHeight,
2313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mLength,
2314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mParameters.getPictureFormat(),
2315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 ( mBracketRangeNegative + 1 ));
2316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
231772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              {
2318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
231972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              }
2320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mImageBufs;
2326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
2327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
2328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
2329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 );
2330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = ( size_t ) ( mBracketRangeNegative + 1 );
2331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
2334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
2336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 //pass capture timestamp along with the camera adapter command
2341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE,  ( mBracketRangePositive + 1 ),  (int) &mStartCapture);
2342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ));
2346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
2353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::stopImageBracketing()
2356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        status_t ret = NO_ERROR;
2358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
2360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( !mBracketingRunning )
2362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
2364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingRunning = false;
2369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!previewEnabled() && !mDisplayPaused)
2372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
2374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE);
2379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
2384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Take a picture.
2388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If able to switch to image capture
2391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if unable to switch to image capture
2392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::takePicture( )
2395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
2398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
2399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int burst;
2400ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    const char *valstr = NULL;
2401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int bufferCount = 1;
2402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&mStartCapture, NULL);
2408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled() && !mDisplayPaused)
2414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2416ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Preview not started...");
2417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
2418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2420ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // return error if we are already capturing
2421ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE &&
2422ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu          mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) ||
2423ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE &&
2424ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu          mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE) ) {
2425ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Already capturing an image...");
2426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
2427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2429ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // we only support video snapshot if we are in video mode (recording hint is set)
2430ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2431ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) &&
2432ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (valstr && strcmp(valstr, TICameraParameters::VIDEO_MODE)) ) {
2433ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Trying to capture while recording without recording hint set...");
2434ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        return INVALID_OPERATION;
2435ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
2436ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( !mBracketingRunning )
2438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if ( NO_ERROR == ret )
2441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            burst = mParameters.getInt(TICameraParameters::KEY_BURST);
2443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //Allocate all buffers only in burst capture case
2446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if ( burst > 1 )
2447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
2448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             bufferCount = CameraHal::NO_BUFFERS_IMAGE_CAPTURE;
2449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( NULL != mAppCallbackNotifier.get() )
2450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
2452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
2454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         else
2455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
2456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( NULL != mAppCallbackNotifier.get() )
2457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(false);
2459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
2461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2462ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // pause preview during normal image capture
2463ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // do not pause preview if recording (video state)
2464ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if (NO_ERROR == ret &&
2465ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                NULL != mDisplayAdapter.get() &&
2466ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                burst < 1) {
2467ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) {
2468ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mDisplayPaused = true;
2469ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mPreviewEnabled = false;
2470ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
2471ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                // since preview is paused we should stop sending preview frames too
2472ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
2473ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME);
2474ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                }
2475ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            }
2476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mDisplayAdapter->setSnapshotTimeRef(&mStartCapture);
2479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2480ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        }
2481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2482ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) )
2483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
2485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  ( int ) &frame,
2487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  bufferCount);
2488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mParameters.getPictureSize(( int * ) &frame.mWidth,
2498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                       ( int * ) &frame.mHeight);
2499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = allocImageBufs(frame.mWidth,
2501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mHeight,
2502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mLength,
2503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mParameters.getPictureFormat(),
2504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 bufferCount);
2505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
2508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mImageBufs;
2514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
2515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
2516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
2517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) bufferCount;
2518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = ( size_t ) bufferCount;
2519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
2522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingRunning = false;
2527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( NULL != mCameraAdapter ) )
2530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //pass capture timestamp along with the camera adapter command
2535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,  (int) &mStartCapture);
2536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
2540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancel a picture that was started with takePicture.
2550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Calling this method when no picture is being taken is a no-op.
2552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent
2555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
2556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelPicture( )
2559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
2565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Return the camera parameters.
2571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return Currently configured camera parameters
2574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar* CameraHal::getParameters()
2577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    String8 params_str8;
2579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char* params_string;
258072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    const char * valstr = NULL;
2581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
2585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2586f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        mCameraAdapter->getParameters(mParameters);
2587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
258972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    CameraParameters mParams = mParameters;
259072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
259172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
259272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
259372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if(valstr != NULL)
259472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      {
259572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if(strcmp(valstr, CameraParameters::TRUE) == 0)
259672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
259772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            //HACK FOR MMS MODE
259872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            resetPreviewRes(&mParams, mVideoWidth, mVideoHeight);
259972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
260072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
2601524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
260272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    params_str8 = mParams.flatten();
2603524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
2604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // camera service frees this string...
2605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params_string = (char*) malloc(sizeof(char) * (params_str8.length()+1));
2606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    strcpy(params_string, params_str8.string());
2607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Return the current set of parameters
2611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return params_string;
2613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::putParameters(char *parms)
2616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    free(parms);
2618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Send command to camera driver.
2622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the command succeeds
2625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes that this function can return
2626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
2629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) )
2636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("No CameraAdapter instance");
2638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
2639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( !previewEnabled() ))
2642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Preview is not running");
2644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
2645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
2648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch(cmd)
2650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_SMOOTH_ZOOM:
2652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1);
2654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_SMOOTH_ZOOM:
2657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM);
2659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_FACE_DETECTION:
2661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD);
2663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_FACE_DETECTION:
2667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
2669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
2673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
2675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release the hardware resources owned by this object.
2684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Note that this is *not* done in the destructor.
2686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::release()
2692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@todo Investigate on how release is used by CameraService. Vaguely remember that this is called
2695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///just before CameraHal object destruction
2696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
2697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Dump state of the camera hardware
2703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] fd    File descriptor
2705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] args  Arguments
2706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Dump succeeded
2707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo  Error codes for dump fail
2708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t  CameraHal::dump(int fd) const
2711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Implement this method when the h/w dump function is supported on Ducati side
2714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Interface Method definitions ENDS here--------------------*/
2718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Internal Method definitions STARTS here--------------------*/
2723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Constructor of CameraHal
2726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Member variables are initialized here.  No allocations should be done here as we
2728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   don't use c++ exceptions in the code.
2729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::CameraHal(int cameraId)
2732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize all the member variables to their defaults
2736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
2737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewBufs = NULL;
2738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageBufs = NULL;
2739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBufProvider = NULL;
2740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStartInProgress = false;
2741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBufs = NULL;
2742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBufProvider = NULL;
2743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
2744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
2745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
2746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMsgEnabled = 0;
2747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier = NULL;
2748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMemoryManager = NULL;
2749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter = NULL;
2750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingEnabled = false;
2751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingRunning = false;
2752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = NULL;
2753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangePositive = 1;
2754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangeNegative = 1;
2755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = 0;
2756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mShutterEnabled = true;
2757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMeasurementEnabled = false;
2758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataBufs = NULL;
2759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = NULL;
2760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCurrentTime = 0;
2761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mFalsePreview = 0;
2762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageOffsets = NULL;
2763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageLength = 0;
2764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageFd = 0;
2765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoOffsets = NULL;
2766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoFd = 0;
2767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoLength = 0;
2768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataOffsets = NULL;
2769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataFd = 0;
2770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataLength = 0;
2771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewFd = 0;
2772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewWidth = 0;
2773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewHeight = 0;
2774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewLength = 0;
2775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewOffsets = NULL;
2776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewRunning = 0;
2777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStateOld = 0;
2778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = 0;
2779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordEnabled = 0;
2780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = NULL;
27813a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu    mDynamicPreviewSwitch = false;
278272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoWidth = 0;
278372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoHeight = 0;
2784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Initialize the CameraHAL constructor timestamp, which is used in the
2788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // PPM() method as time reference if the user does not supply one.
2789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&ppm_start, NULL);
2790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraIndex = cameraId;
2794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Destructor of CameraHal
2800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function simply calls deinitialize() to free up memory allocate during construct
2802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   phase
2803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::~CameraHal()
2805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Call de-initialize here once more - it is the last chance for us to relinquish all the h/w and s/w resources
2809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
2810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
2812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
2815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
2816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the callback notifier
2819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier.clear();
2820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the display adapter
2822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayAdapter.clear();
2823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
2825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int strongCount = mCameraAdapter->getStrongCount();
2826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->decStrong(mCameraAdapter);
2828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
2830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2832de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    freeImageBufs();
2833de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
2834de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    /// Free the memory manager
2835de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    mMemoryManager.clear();
2836de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
2837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Initialize the Camera HAL
2842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Creates CameraAdapter, AppCallbackNotifier, DisplayAdapter and MemoryManager
2844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param None
2846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR - On success
2847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         NO_MEMORY - On failure to allocate memory for any of the objects
2848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @remarks Camera Hal internal function
2849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::initialize(CameraProperties::Properties* properties)
2853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int sensor_index = 0;
2857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize the event mask used for registering an event provider for AppCallbackNotifier
2859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Currently, registering all events as to be coming from CameraAdapter
2860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int32_t eventMask = CameraHalEvent::ALL_EVENTS;
2861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Get my camera properties
2863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = properties;
2864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mCameraProperties)
2866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Dump the properties of this Camera
2871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // will only print if DEBUG macro is defined
2872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties->dump();
2873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)) != 0 )
2875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        sensor_index = atoi(mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX));
2877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Sensor index %d", sensor_index);
2880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
28819a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu    mCameraAdapter = CameraAdapter_Factory(sensor_index);
28829a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu    if ( ( NULL == mCameraAdapter ) || (mCameraAdapter->initialize(properties)!=NO_ERROR))
2883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Unable to create or initialize CameraAdapter");
2885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
2886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->incStrong(mCameraAdapter);
2890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerImageReleaseCallback(releaseImageBuffers, (void *) this);
2891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerEndCaptureCallback(endImageCapture, (void *)this);
2892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mAppCallbackNotifier.get())
2894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create the callback notifier
2896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier = new AppCallbackNotifier();
2897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mAppCallbackNotifier.get() ) || ( mAppCallbackNotifier->initialize() != NO_ERROR))
2898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize AppCallbackNotifier");
2900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
2901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mMemoryManager.get())
2905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create Memory Manager
2907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mMemoryManager = new MemoryManager();
2908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mMemoryManager.get() ) || ( mMemoryManager->initialize() != NO_ERROR))
2909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize MemoryManager");
2911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
2912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Setup the class dependencies...
2916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///AppCallbackNotifier has to know where to get the Camera frames and the events like auto focus lock etc from.
2918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///CameraAdapter is the one which provides those events
2919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the frame and event providers for AppCallbackNotifier
2920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@remarks  setEventProvider API takes in a bit mask of events for registering a provider for the different events
2921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         That way, if events can come from DisplayAdapter in future, we will be able to add it as provider
2922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         for any event
2923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setEventProvider(eventMask, mCameraAdapter);
2924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setFrameProvider(mCameraAdapter);
2925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Any dynamic errors that happen during the camera use case has to be propagated back to the application
2927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
2928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the error handler for CameraAdapter
2929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->setErrorHandler(mAppCallbackNotifier.get());
2930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
2932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier->start() != NO_ERROR)
2933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      {
2934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't start AppCallbackNotifier");
2935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      }
2937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Started AppCallbackNotifier..");
2939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
2940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize default parameters
2942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    initDefaultParameters();
2943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( setParameters(mParameters) != NO_ERROR )
2946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Failed to set default parameters?!");
2948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // register for sensor events
2951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = new SensorListener();
2952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
2953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (mSensorListener->initialize() == NO_ERROR) {
2954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->setCallbacks(orientation_cb, this);
2955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->enableSensor(SensorListener::SENSOR_ORIENTATION);
2956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        } else {
2957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Error initializing SensorListener. not fatal, continuing");
2958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener.clear();
2959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener = NULL;
2960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fail_loop:
2968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Free up the resources because we failed somewhere up
2970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        deinitialize();
2971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
2974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions)
2978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
2980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status = NO_ERROR;
2981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
2982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
2983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedResolutions )
2987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported resolutions string");
2989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
2990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
2991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status = snprintf(tmpBuffer, PARAM_BUFFER, "%dx%d", width, height);
2994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 > status )
2995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
2997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
2998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
2999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedResolutions, tmpBuffer);
3002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(const char *param, const char *supportedParams)
3019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
3021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
3022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedParams )
3026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
3028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == param )
3033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid parameter string");
3035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedParams, param);
3040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(int param, const char *supportedParams)
3057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
3059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
3060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status;
3061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedParams )
3066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
3068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status = snprintf(tmpBuffer, PARAM_BUFFER, "%d", param);
3073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 > status )
3074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
3076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedParams, tmpBuffer);
3081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3097f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luustatus_t CameraHal::doesSetParameterNeedUpdate(const char* new_param, const char* old_param, bool& update) {
3098f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if (!new_param || !old_param) {
3099f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        return -EINVAL;
3100f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
3101f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3102f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    // if params mismatch we should update parameters for camera adapter
3103f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if ((strcmp(new_param, old_param) != 0)) {
3104f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu       update = true;
3105f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
3106f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3107f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu   return NO_ERROR;
3108f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu}
3109f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::parseResolution(const char *resStr, int &width, int &height)
3111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
3113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *ctx, *pWidth, *pHeight;
3114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *sep = "x";
3115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *tmp = NULL;
3116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == resStr )
3120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
3122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //This fixes "Invalid input resolution"
3125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *resStr_copy = (char *)malloc(strlen(resStr) + 1);
3126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL!=resStr_copy ) {
3127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        strcpy(resStr_copy, resStr);
3130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pWidth = strtok_r( (char *) resStr_copy, sep, &ctx);
3131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pWidth )
3133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            width = atoi(pWidth);
3135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
3137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
3140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pHeight = strtok_r(NULL, sep, &ctx);
3146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pHeight )
3148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            height = atoi(pHeight);
3150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
3152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
3155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        free(resStr_copy);
3159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        resStr_copy = NULL;
3160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     }
3161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::insertSupportedParams()
3167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters &p = mParameters;
3173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set the name of the camera
3175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CAMERA_NAME, mCameraProperties->get(CameraProperties::CAMERA_NAME));
3176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = atoi(mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES));
3180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS));
3181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES));
3182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
3183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
3184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_THUMBNAIL_SIZES));
3185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE));
3186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_EFFECTS, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS));
3187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES));
3189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES));
3190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING));
3191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MAX));
3192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MIN));
3193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_EV_STEP));
3194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES));
3196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_ISO_VALUES, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES));
3197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM_RATIOS, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_RATIOS));
3198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_ZOOM, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::ZOOM_SUPPORTED));
3200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::SMOOTH_ZOOM_SUPPORTED));
3201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_IPP, mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES));
3202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D_SUPPORTED,mCameraProperties->get(CameraProperties::S3D_SUPPORTED));
3203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D2D_PREVIEW_MODE,mCameraProperties->get(CameraProperties::S3D2D_PREVIEW_MODES));
3204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE));
3205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
3206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_VSTAB,mCameraProperties->get(CameraProperties::VSTAB));
3207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_VSTAB_VALUES,mCameraProperties->get(CameraProperties::VSTAB_VALUES));
3208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
3209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED));
3212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED));
32139919dafce4d57f0b9b9aedafc95b756464685009Tyler Luu    p.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, mCameraProperties->get(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED));
3214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::initDefaultParameters()
3220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Purpose of this function is to initialize the default current and supported parameters for the currently
3222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //selected camera.
3223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters &p = mParameters;
3225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentRevision, adapterRevision;
3226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
3227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int width, height;
3228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PREVIEW_SIZE), width, height);
3232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(width, height);
3236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT);
3240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PICTURE_SIZE), width, height);
3243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(width, height);
3247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(PICTURE_WIDTH, PICTURE_HEIGHT);
3251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_SIZE), width, height);
3254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width);
3258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height);
3259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, MIN_WIDTH);
3263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, MIN_HEIGHT);
3264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    insertSupportedParams();
3267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Insert default values
3269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFrameRate(atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)));
3270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFormat(mCameraProperties->get(CameraProperties::PREVIEW_FORMAT));
3271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPictureFormat(mCameraProperties->get(CameraProperties::PICTURE_FORMAT));
3272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_JPEG_QUALITY, mCameraProperties->get(CameraProperties::JPEG_QUALITY));
3273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_WHITE_BALANCE, mCameraProperties->get(CameraProperties::WHITEBALANCE));
3274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EFFECT,  mCameraProperties->get(CameraProperties::EFFECT));
3275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ANTIBANDING, mCameraProperties->get(CameraProperties::ANTIBANDING));
3276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FOCUS_MODE, mCameraProperties->get(CameraProperties::FOCUS_MODE));
3278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::EV_COMPENSATION));
3279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SCENE_MODE, mCameraProperties->get(CameraProperties::SCENE_MODE));
3280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM, mCameraProperties->get(CameraProperties::ZOOM));
3282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CONTRAST, mCameraProperties->get(CameraProperties::CONTRAST));
3283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SATURATION, mCameraProperties->get(CameraProperties::SATURATION));
3284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_BRIGHTNESS, mCameraProperties->get(CameraProperties::BRIGHTNESS));
3285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SHARPNESS, mCameraProperties->get(CameraProperties::SHARPNESS));
3286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXPOSURE_MODE, mCameraProperties->get(CameraProperties::EXPOSURE_MODE));
3287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_ISO, mCameraProperties->get(CameraProperties::ISO_MODE));
3288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_IPP, mCameraProperties->get(CameraProperties::IPP));
3289d054c26243e4cf49e5fe04789e4437e5e0f3f574Sundar Raman    p.set(TICameraParameters::KEY_GBCE, mCameraProperties->get(CameraProperties::GBCE));
3290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D2D_PREVIEW, mCameraProperties->get(CameraProperties::S3D2D_PREVIEW));
3291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_AUTOCONVERGENCE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE));
3292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
3293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_VSTAB,mCameraProperties->get(CameraProperties::VSTAB));
3294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_VSTAB_VALUES,mCameraProperties->get(CameraProperties::VSTAB_VALUES));
3295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FOCAL_LENGTH, mCameraProperties->get(CameraProperties::FOCAL_LENGTH));
3296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::HOR_ANGLE));
3297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::VER_ANGLE));
3298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
3299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MAKE, mCameraProperties->get(CameraProperties::EXIF_MAKE));
3302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MODEL, mCameraProperties->get(CameraProperties::EXIF_MODEL));
3303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_QUALITY));
3304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, "OMX_TI_COLOR_FormatYUV420PackedSemiPlanar");
3305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, mCameraProperties->get(CameraProperties::MAX_FD_HW_FACES));
3306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, mCameraProperties->get(CameraProperties::MAX_FD_SW_FACES));
3307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Only one area a.k.a Touch AF for now.
3309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // TODO: Add support for multiple focus areas.
3310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, mCameraProperties->get(CameraProperties::MAX_FOCUS_AREAS));
3311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK));
3312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK));
3313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, mCameraProperties->get(CameraProperties::MAX_NUM_METERING_AREAS));
3314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
3320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
3322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::forceStopPreview()
3325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // stop bracketing if it is running
3329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    stopImageBracketing();
3330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() != NULL) {
3332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Stop the buffer display first
3333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->disableDisplay();
3334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier.get() != NULL) {
3337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Stop the callback sending
3338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stop();
333926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu        mAppCallbackNotifier->flushAndReturnFrames();
3340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stopPreviewCallbacks();
3341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
3344342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        CameraAdapter::AdapterState currentState;
3345342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        CameraAdapter::AdapterState nextState;
3346aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
3347342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        currentState = mCameraAdapter->getState();
3348342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        nextState = mCameraAdapter->getNextState();
3349aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
3350342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // since prerequisite for capturing is for camera system
3351342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // to be previewing...cancel all captures before stopping
3352342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // preview
3353342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        if ( (currentState == CameraAdapter::CAPTURE_STATE) &&
3354342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu             (nextState != CameraAdapter::PREVIEW_STATE)) {
3355342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
3356342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
3357342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu
3358342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // only need to send these control commands to state machine if we are
3359342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // passed the LOADED_PREVIEW_STATE
3360342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        if (currentState > CameraAdapter::LOADED_PREVIEW_STATE) {
3361342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // according to javadoc...FD should be stopped in stopPreview
3362342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // and application needs to call startFaceDection again
3363342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // to restart FD
3364342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
3365342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu
3366342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           cancelAutoFocus();
3367342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
3368342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu
3369342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // only need to send these control commands to state machine if we are
3370342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // passed the INITIALIZED_STATE
3371342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        if (currentState > CameraAdapter::INTIALIZED_STATE) {
3372342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           //Stop the source of frames
3373342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
3374342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
3375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewBufs();
3378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewDataBufs();
3379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
3381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
3382342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu    mPreviewStartInProgress = false;
3383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Deallocates memory for all the resources held by Camera HAL.
3389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter,
3391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   and Memory Manager
3392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
3395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::deinitialize()
3398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3401f5094850dd99854af026e16bd21d8555a5168afbSundar Raman    if ( mPreviewEnabled || mDisplayPaused ) {
3402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        forceStopPreview();
3403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
3406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
3408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION);
3409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener.clear();
3410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener = NULL;
3411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::storeMetaDataInBuffers(bool enable)
3418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mAppCallbackNotifier->useMetaDataBufferMode(enable);
3422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3426a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boatengvoid CameraHal::selectFPSRange(int framerate, int *min_fps, int *max_fps)
3427a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng{
3428a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  char * ptr;
3429a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  char supported[MAX_PROP_VALUE_LENGTH];
3430a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  int fpsrangeArray[2];
3431a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  int i = 0;
3432a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3433a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  LOG_FUNCTION_NAME;
3434a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  size_t size = strlen(mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))+1;
3435a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  strncpy(supported, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED), size);
3436a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3437a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  ptr = strtok (supported," (,)");
3438a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3439a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  while (ptr != NULL)
3440a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng    {
3441a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      fpsrangeArray[i]= atoi(ptr)/CameraHal::VFR_SCALE;
3442a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      if (i == 1)
3443a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng        {
3444a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          if (framerate == fpsrangeArray[i])
3445a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng            {
3446a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              CAMHAL_LOGDB("SETTING FPS RANGE min = %d max = %d \n", fpsrangeArray[0], fpsrangeArray[1]);
3447d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman              *min_fps = fpsrangeArray[0]*CameraHal::VFR_SCALE;
3448d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman              *max_fps = fpsrangeArray[1]*CameraHal::VFR_SCALE;
3449a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              break;
3450a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng            }
3451a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng        }
3452a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      ptr = strtok (NULL, " (,)");
3453a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      i++;
3454a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      i%=2;
3455a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng    }
3456a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3457a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
3458a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3459a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng}
3460a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
346172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengvoid CameraHal::setPreferredPreviewRes(int width, int height)
346272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
346372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
346472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
346572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width == 320) && (height == 240)){
346672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParameters.setPreviewSize(640,480);
346772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
346872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width == 176) && (height == 144)){
346972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParameters.setPreviewSize(704,576);
347072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
347172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
347272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
347372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
347472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
347572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengvoid CameraHal::resetPreviewRes(CameraParameters *mParams, int width, int height)
347672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
347772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
347872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
347972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width <= 320) && (height <= 240)){
348072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParams->setPreviewSize(mVideoWidth, mVideoHeight);
348172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
348272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
348372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
348472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
348572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
3486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
3487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3489