CameraHal.cpp revision d2d3968a441810c81cf9f46ff43af29cb6fdfb93
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
37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevextern "C" CameraAdapter* CameraAdapter_Factory();
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);
3593a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               }
3603a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           }
3613a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           else
3623a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           {
3633a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ( !isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
3643a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3653a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
3663a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                return -EINVAL;
3673a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3683a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            else
3693a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3703a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.setPreviewSize(w, h);
3713a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3723a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           }
3733a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3743a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ( ( oldWidth != w ) || ( oldHeight != h ) )
3753a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3763a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mDynamicPreviewSwitch = true;
3773a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3783a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3793a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            CAMHAL_LOGDB("PreviewResolution by App %d x %d", w, h);
3803a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
3813a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
382b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
383b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        valstr = params.get(CameraParameters::KEY_RECORDING_HINT);
384b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(valstr != NULL)
385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
386b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if(strcmp(valstr, CameraParameters::TRUE) == 0)
387b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
388b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
389b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
390b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                restartPreviewRequired = setVideoModeParameters();
391381ec2390c3d9d6ba3b67cf53e69fec96e7a7bd1Akwasi Boateng                videoMode = true;
392b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
393b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else if(strcmp(valstr, CameraParameters::FALSE) == 0)
394b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
395b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
396b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
397b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                restartPreviewRequired = resetVideoModeParameters();
398b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
399b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
400b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
401b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGEA("Invalid RECORDING_HINT");
402b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                return -EINVAL;
403b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
407b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // This check is required in following case.
408b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // If VideoRecording activity sets KEY_RECORDING_HINT to TRUE and
409b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // ImageCapture activity doesnot set KEY_RECORDING_HINT to FALSE (i.e. simply NULL),
410b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // then Video Mode parameters may remain present in ImageCapture activity as well.
411b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Recording Hint is set to NULL");
412b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_RECORDING_HINT, "");
413b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            restartPreviewRequired = resetVideoModeParameters();
414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
416b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Below parameters can be changed when the preview is running
417f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ( (valstr = params.getPictureFormat()) != NULL ) {
418f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(params.getPictureFormat(),mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) {
419f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.setPictureFormat(valstr);
420f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
421f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr);
422f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
426b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        params.getPictureSize(&w, &h);
427f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ( isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES))) {
428b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.setPictureSize(w, h);
429f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        } else {
430f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            CAMHAL_LOGEB("ERROR: Invalid picture resolution %dx%d", w, h);
431f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            ret = -EINVAL;
432f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
434b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Picture Size by App %d x %d", w, h);
435b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
436f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) {
437f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BURST) >=0) {
438f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Burst set %s", params.get(TICameraParameters::KEY_BURST));
439f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BURST, valstr);
440f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
441f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr);
442f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
444f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
446b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        framerate = params.getPreviewFrameRate();
447524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        valstr = params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
448b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("FRAMERATE %d", framerate);
449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
450524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGVB("Passed FRR: %s, Supported FRR %s", valstr
451524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
452524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGVB("Passed FR: %d, Supported FR %s", framerate
453524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
454524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
455524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
456524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        //Perform parameter validation
457524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if(!isParameterValid(valstr
458524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))
459524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        || !isParameterValid(framerate,
460524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                                      mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES)))
461524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        {
462524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("Invalid frame rate range or frame rate");
463524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            return -EINVAL;
464524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        }
465524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
4661521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // Variable framerate ranges have higher priority over
4671521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // deprecated constant FPS. "KEY_PREVIEW_FPS_RANGE" should
4681521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // be cleared by the client in order for constant FPS to get
4691521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // applied.
470524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( strcmp(valstr, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE))  != 0)
471a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
472524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            // APP wants to set FPS range
473524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            //Set framerate = MAXFPS
474524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGDA("APP IS CHANGING FRAME RATE RANGE");
475b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            params.getPreviewFpsRange(&minFPS, &maxFPS);
476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
477b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( ( 0 > minFPS ) || ( 0 > maxFPS ) )
478a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              {
479f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEA("ERROR: FPS Range is negative!");
480524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                return -EINVAL;
481a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              }
482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
483524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            framerate = maxFPS /CameraHal::VFR_SCALE;
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
485524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          }
486524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        else
487524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          {
488524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman              if ( framerate != atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)) )
489a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              {
490524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                selectFPSRange(framerate, &minFPS, &maxFPS);
491a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              }
492524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman              else
493524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                {
494524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    if (videoMode) {
495524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_VIDEO);
496524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        CameraParameters temp;
497524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
498524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
499524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    }
500524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    else {
501524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_IMAGE);
502524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        CameraParameters temp;
503524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
504524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
505524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    }
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
507524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    framerate = maxFPS / CameraHal::VFR_SCALE;
508524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                }
509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
510524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          }
511a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
512524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("FPS Range = %s", valstr);
513524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("DEFAULT FPS Range = %s", mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
515524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        minFPS /= CameraHal::VFR_SCALE;
516524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        maxFPS /= CameraHal::VFR_SCALE;
517524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
518524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( ( 0 == minFPS ) || ( 0 == maxFPS ) )
519a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
520524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("ERROR: FPS Range is invalid!");
521524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            ret = -EINVAL;
522a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          }
523524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
524524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( maxFPS < minFPS )
525a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
526524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("ERROR: Max FPS is smaller than Min FPS!");
527524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            ret = -EINVAL;
528a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          }
529524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
530524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.setPreviewFrameRate(framerate);
531524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
532524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("FPS Range [%d, %d]", minFPS, maxFPS);
533524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.set(TICameraParameters::KEY_MINFRAMERATE, minFPS);
534524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.set(TICameraParameters::KEY_MAXFRAMERATE, maxFPS);
535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
536b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( valstr = params.get(TICameraParameters::KEY_GBCE) ) != NULL )
537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
538b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GBCE Value = %s", valstr);
539b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GBCE, valstr);
540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
542b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( valstr = params.get(TICameraParameters::KEY_GLBCE) ) != NULL )
543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
544b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GLBCE Value = %s", valstr);
545b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GLBCE, valstr);
546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
548b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Update the current parameter set
549b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL)
550b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
551b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("AutoConvergence Mode is set = %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE));
552b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr);
5531521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu            }
554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
555b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES)) !=NULL )
556b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
557b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("ManualConvergence Value = %s", params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES));
558b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, valstr);
559b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
561f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_EXPOSURE_MODE)) != NULL) {
562f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES))) {
563f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Exposure set = %s", valstr);
564f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr);
565f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
566f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Exposure  = %s", valstr);
567f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
568b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
569f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
571f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_WHITE_BALANCE)) != NULL) {
572f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu           if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) {
573f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGDB("White balance set %s", valstr);
574f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               mParameters.set(CameraParameters::KEY_WHITE_BALANCE, valstr);
575f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
576f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGEB("ERROR: Invalid white balance  = %s", valstr);
577f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               ret = -EINVAL;
578b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
579f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
581f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) {
582f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) {
583f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Contrast set %s", valstr);
584f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_CONTRAST, valstr);
585f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
586f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Contrast  = %s", valstr);
587f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
588b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
589f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
591f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr =params.get(TICameraParameters::KEY_SHARPNESS)) != NULL) {
592f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SHARPNESS) >= 0 ) {
593f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Sharpness set %s", valstr);
594f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr);
595f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
596f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr);
597f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
598b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
599f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
601f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_SATURATION)) != NULL) {
602f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SATURATION) >= 0 ) {
603f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Saturation set %s", valstr);
604f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SATURATION, valstr);
605f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
606f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr);
607f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
608b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
609f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
611f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BRIGHTNESS)) != NULL) {
612f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BRIGHTNESS) >= 0 ) {
613f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Brightness set %s", valstr);
614f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr);
615f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
616f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr);
617f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
618f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
619f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
620f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu
621f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_ANTIBANDING)) != NULL) {
622f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) {
623f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Antibanding set %s", valstr);
624f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_ANTIBANDING, valstr);
625f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
626f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr);
627f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
628f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
629f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
630f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu
631f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) {
632f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) {
633f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("ISO set %s", valstr);
634f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_ISO, valstr);
635f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
636f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr);
637f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
638b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
639f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
641f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) {
642f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) {
643f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Focus mode set %s", params.get(CameraParameters::KEY_FOCUS_MODE));
644f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_FOCUS_MODE, valstr);
645f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
646f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr);
647f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
648f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
649f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
651b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_FOCUS_AREAS)) != NULL )
652b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
653b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGEB("Focus areas position set %s", params.get(CameraParameters::KEY_FOCUS_AREAS));
654b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_FOCUS_AREAS, valstr);
655b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
657b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL )
658b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
659b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Measurements set to %s", params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE));
660b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_MEASUREMENT_ENABLE, valstr);
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
662b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_ENABLE) == 0)
663b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
664b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = true;
665b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
666b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_DISABLE) == 0)
667b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
668b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
669b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
670b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
671b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
672b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
673b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
675b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
677b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL)
678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
679b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Exposure compensation set %s", params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION));
680b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr);
681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
682b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
683f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_SCENE_MODE)) != NULL) {
684f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES))) {
685f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Scene mode set %s", valstr);
686f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_SCENE_MODE, valstr);
687f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
688f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr);
689f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
691f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
692b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
693f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_FLASH_MODE)) != NULL) {
694f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES))) {
695f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Flash mode set %s", valstr);
696f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_FLASH_MODE, valstr);
697f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
698f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr);
699f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
701f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
703f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_EFFECT)) != NULL) {
704f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS))) {
705f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Effect set %s", valstr);
706f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_EFFECT, valstr);
707f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
708f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr);
709f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
710f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
711f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
713b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_ROTATION)) != NULL)
714b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_ROTATION) >=0))
715b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
716b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Rotation set %s", params.get(CameraParameters::KEY_ROTATION));
717b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_ROTATION, valstr);
718b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
720b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_QUALITY)) != NULL)
721b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_QUALITY) >=0))
722b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
723b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Jpeg quality set %s", params.get(CameraParameters::KEY_JPEG_QUALITY));
724b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_QUALITY, valstr);
725b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
727b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH)) != NULL)
728b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH) >=0))
729b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
730b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH));
731b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, valstr);
732b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
734b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT)) != NULL)
735b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT) >=0))
736b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
737b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT));
738b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, valstr);
739b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
741b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY)) != NULL )
742b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY) >=0))
743b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
744b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail quality set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY));
745b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, valstr);
746b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
748b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_LATITUDE)) != NULL )
749b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
750b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS latitude set %s", params.get(CameraParameters::KEY_GPS_LATITUDE));
751b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_LATITUDE, valstr);
752b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
753b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_LATITUDE);
754b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
756b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_LONGITUDE)) != NULL )
757b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
758b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS longitude set %s", params.get(CameraParameters::KEY_GPS_LONGITUDE));
759b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_LONGITUDE, valstr);
760b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
761b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_LONGITUDE);
762b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
764b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_ALTITUDE)) != NULL )
765b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
766b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS altitude set %s", params.get(CameraParameters::KEY_GPS_ALTITUDE));
767b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_ALTITUDE, valstr);
768b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
769b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_ALTITUDE);
770b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
772b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_TIMESTAMP)) != NULL )
773b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
774b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS timestamp set %s", params.get(CameraParameters::KEY_GPS_TIMESTAMP));
775b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_TIMESTAMP, valstr);
776b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
777b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_TIMESTAMP);
778b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
780b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL )
781b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
782b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS datestamp set %s", params.get(TICameraParameters::KEY_GPS_DATESTAMP));
783b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr);
784b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
785b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP);
786b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
788b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL )
789b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
790b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS processing method set %s", params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD));
791b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr);
792b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
793b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD);
794b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
796b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL )
797b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
798b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_MAPDATUM));
799b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr);
800b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
801b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM);
802b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
804b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL )
805b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
806b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_VERSION));
807b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr);
808b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
809b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_VERSION);
810b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
812b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL )
813b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
814b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("EXIF Model set %s", params.get(TICameraParameters::KEY_EXIF_MODEL));
815b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr);
816b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
818b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL )
819b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
820b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("EXIF Make set %s", params.get(TICameraParameters::KEY_EXIF_MAKE));
821b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr);
822b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
824b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL )
825b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
826b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE));
827b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valstr);
828b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
829b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else
830b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
831b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
832b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
834f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_ZOOM)) != NULL ) {
835f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((params.getInt(CameraParameters::KEY_ZOOM) >= 0 ) &&
836f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                (params.getInt(CameraParameters::KEY_ZOOM) <= mMaxZoomSupported )) {
837f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Zoom set %s", valstr);
838f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                doesSetParameterNeedUpdate(valstr,
839f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                           mParameters.get(CameraParameters::KEY_ZOOM),
840f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                           updateRequired);
841f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_ZOOM, valstr);
842f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
843f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr);
844f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
845b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
846f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
848b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL )
849b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
850b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Auto Exposure Lock set %s", params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
851f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
852f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       mParameters.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK),
853f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
854b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr);
855b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
857b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL )
858b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
859b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
860f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
861f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       mParameters.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK),
862f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
863b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr);
864b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
865708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        if( (valstr = params.get(CameraParameters::KEY_METERING_AREAS)) != NULL )
866708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            {
867708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            CAMHAL_LOGEB("Metering areas position set %s", params.get(CameraParameters::KEY_METERING_AREAS));
868708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            mParameters.set(CameraParameters::KEY_METERING_AREAS, valstr);
869708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            }
870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
871b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CameraParameters adapterParams = mParameters;
872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
873b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        // Only send parameters to adapter if preview is already
874f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter,
875f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // will be called in startPreview()
876f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // TODO(XXX): Need to identify other parameters that need update from camera adapter
877f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        if ( (NULL != mCameraAdapter) && (mPreviewEnabled || updateRequired) ) {
878b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ret |= mCameraAdapter->setParameters(adapterParams);
879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
881b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) )
882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
883b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS);
884b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( 0 < posBracketRange )
885b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
886b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketRangePositive = posBracketRange;
887b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
889b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Positive bracketing range %d", mBracketRangePositive);
890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
892b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG) )
893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
894b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            int negBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG);
895b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( 0 < negBracketRange )
896b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
897b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketRangeNegative = negBracketRange;
898b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
900b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Negative bracketing range %d", mBracketRangeNegative);
901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
902b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL) &&
903b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::BRACKET_ENABLE) == 0 ))
904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
905b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( !mBracketingEnabled )
906b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
907b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Enabling bracketing");
908b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketingEnabled = true;
909b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
910b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                //Wait for AF events to enable bracketing
911b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                if ( NULL != mCameraAdapter )
912b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    {
913b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    setEventProvider( CameraHalEvent::ALL_EVENTS, mCameraAdapter );
914b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    }
915b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
916b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
918b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Bracketing already enabled");
919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
921b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else if ( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL ) &&
922b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::BRACKET_DISABLE) == 0 ))
923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
924b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling bracketing");
925b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
926b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mBracketingEnabled = false;
927b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            stopImageBracketing();
928b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
929b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            //Remove AF events subscription
930b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( NULL != mEventProvider )
931b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
932b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mEventProvider->disableEventNotification( CameraHalEvent::ALL_EVENTS );
933b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                delete mEventProvider;
934b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mEventProvider = NULL;
935b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
936b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
939b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
940b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::SHUTTER_ENABLE) == 0 ))
941b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
942b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Enabling shutter sound");
943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
944b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = true;
945b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled |= CAMERA_MSG_SHUTTER;
946b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
947b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
948b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else if ( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
949b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::SHUTTER_DISABLE) == 0 ))
950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
951b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling shutter sound");
952b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
953b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = false;
954b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled &= ~CAMERA_MSG_SHUTTER;
955b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
958b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
960b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    //On fail restore old parameters
961b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    if ( NO_ERROR != ret ) {
962b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman        mParameters.unflatten(oldParams.flatten());
963b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    }
964b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman
965b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running.
966b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // If preview is not started yet, Video Mode parameters will take effect on next startPreview()
967b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if(restartPreviewRequired && previewEnabled())
968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
969b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Restarting Preview as needed by KEY_RECODING_HINT");
970b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ret = restartPreview();
971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
972b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if (ret != NO_ERROR)
973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
974b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGEA("Failed to restart Preview");
975b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        return ret;
976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
981b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        unsigned int buffercount, unsigned int &max_queueable)
985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() == NULL)
991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Memory allocation of preview buffers is now placed in gralloc
993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // CameraHal should not allocate preview buffers without DisplayAdapter
994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mPreviewBufs)
998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///@todo Pluralise the name of this method to allocateBuffers
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewLength = 0;
1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewBufs = (int32_t *) mDisplayAdapter->allocateBuffer(width, height,
1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    previewFormat,
1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    mPreviewLength,
1004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    buffercount);
1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (NULL == mPreviewBufs ) {
1007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview buffers");
1008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_MEMORY;
1009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets();
1012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == mPreviewOffsets ) {
1013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Buffer mapping failed");
1014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return BAD_VALUE;
1015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewFd = mDisplayAdapter->getFd();
1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( -1 == mPreviewFd ) {
1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Invalid handle");
1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return BAD_VALUE;
1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          }
1022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBufProvider = (BufferProvider*) mDisplayAdapter.get();
1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->maxQueueableBuffers(max_queueable);
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (ret != NO_ERROR) {
1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewBufs()
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("mPreviewBufs = 0x%x", (unsigned int)mPreviewBufs);
1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mPreviewBufs)
1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///@todo Pluralise the name of this method to freeBuffers
1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mBufProvider->freeBuffer(mPreviewBufs);
1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewBufs = NULL;
1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount)
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int bytes;
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bytes = size;
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mPreviewDataBufs )
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = freePreviewDataBufs();
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1076c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman        bytes = ((bytes+4095)/4096)*4096;
1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, NULL, bytes, bufferCount);
1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes);
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL == mPreviewDataBufs )
1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -NO_MEMORY;
1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes = size;
1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = mMemoryManager->getFd();
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = bytes;
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = mMemoryManager->getOffsets();
1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = -1;
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = 0;
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = NULL;
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewDataBufs()
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mPreviewDataBufs )
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@todo Pluralise the name of this method to freeBuffers
1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mMemoryManager->freeBuffer(mPreviewDataBufs);
1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mPreviewDataBufs = NULL;
1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size, const char* previewFormat, unsigned int bufferCount)
1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int bytes;
1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bytes = size;
1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Always allocate the buffers for image capture using MemoryManager
1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL != mImageBufs ) )
1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = freeImageBufs();
1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1153c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman        bytes = ((bytes+4095)/4096)*4096;
1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, previewFormat, bytes, bufferCount);
1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes);
1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL == mImageBufs )
1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -NO_MEMORY;
1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes = size;
1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = mMemoryManager->getFd();
1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = bytes;
1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = mMemoryManager->getOffsets();
1173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = -1;
1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = 0;
1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = NULL;
1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid endImageCapture( void *userData)
1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != userData )
1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->signalEndImageCapture();
1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid releaseImageBuffers(void *userData)
1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1203de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman// Make releaseImageBuffers a no-op for now because it is racing against AppCallbackNotifier
1204de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman// in the home screen use-case. Image capture buffers are anyways reallocated on subsequent
1205de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman// captures and also released as part of final camera hal cleanup
1206de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman#if 0
1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != userData )
1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->freeImageBufs();
1211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1212de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman#endif
1213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::signalEndImageCapture()
1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w,h;
1221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters adapterParams = mParameters;
1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
1227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freeImageBufs()
1234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mImageBufs )
1243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@todo Pluralise the name of this method to freeBuffers
1246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mMemoryManager->freeBuffer(mImageBufs);
1247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mImageBufs = NULL;
1248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
1253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start preview mode.
1266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Camera switched to VF mode
1269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update function header with the different errors that are possible
1270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startPreview()
1273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
1277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
1278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
1279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int required_buffer_count;
1280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int max_queueble_buffers;
1281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartPreview, NULL);
1285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1290e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    if ( mPreviewEnabled )
1291e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    {
1292e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    CAMHAL_LOGDA("Preview already running");
1293e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1294e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    LOG_FUNCTION_NAME_EXIT;
1295e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1296e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    return ALREADY_EXISTS;
1297e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1298e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1299e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    if ( NULL != mCameraAdapter ) {
1300e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
13015950d86f5e3d119cb024ae3989a643571dd81794Sundar Raman        ret = mCameraAdapter->setParameters(mParameters);
1302e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1303e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1304e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    ///If we don't have the preview callback enabled and display adapter,
1305e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL))
1306e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    {
1307e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman        CAMHAL_LOGEA("Preview not started. Preview in progress flag set");
1308e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman        mPreviewStartInProgress = true;
1309e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman        return NO_ERROR;
1310e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1311e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) )
1313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Preview is in paused state");
1315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayPaused = false;
1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewEnabled = true;
1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("Display adapter resume failed %x", ret);
1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //restart preview callbacks
1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME);
1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
13323a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu        if ( mDynamicPreviewSwitch )
13333a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            {
13343a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            forceStopPreview();
13353a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            mDynamicPreviewSwitch = false;
13363a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
13373a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu        else
13383a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            {
13393a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            return ret;
13403a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Ensure that buffers for preview are allocated before we start the camera
1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Get the updated size from Camera Adapter, to account for padding etc
1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW,
1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                      ( int ) &frame);
1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR != ret )
1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Update the current preview width and height
1353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewWidth = frame.mWidth;
1354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewHeight = frame.mHeight;
1355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Update the padded width and height - required for VNF and VSTAB
1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mParameters.set(TICameraParameters::KEY_PADDED_WIDTH, mPreviewWidth);
1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mParameters.set(TICameraParameters::KEY_PADDED_HEIGHT, mPreviewHeight);
1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Allocate the preview buffers
1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = allocPreviewBufs(frame.mWidth, frame.mHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
1364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR != ret )
1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't allocate buffers for Preview");
1368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mMeasurementEnabled )
1372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA,
1375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          ( int ) &frame,
1376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          required_buffer_count);
1377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
1378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ///Allocate the preview data buffers
1383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = allocPreviewDataBufs(frame.mLength, required_buffer_count);
1384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret ) {
1385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview data buffers");
1386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto error;
1387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev           }
1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mPreviewDataBufs;
1392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mPreviewDataOffsets;
1393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mPreviewDataFd;
1394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mPreviewDataLength;
1395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) required_buffer_count;
1396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = (size_t) required_buffer_count;
1397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA,
1399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        ( int ) &desc);
1400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Pass the buffers to Camera Adapter
1405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mBuffers = mPreviewBufs;
1406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mOffsets = mPreviewOffsets;
1407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mFd = mPreviewFd;
1408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mLength = mPreviewLength;
1409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mCount = ( size_t ) required_buffer_count;
1410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mMaxQueueable = (size_t) max_queueble_buffers;
1411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
14128fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW,
14138fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman                                      ( int ) &desc);
14148fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman
14158fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    if ( NO_ERROR != ret )
14168fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        {
14178fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret);
14188fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        freePreviewBufs();
14198fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        return ret;
14208fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        }
1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count);
1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
1425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mAppCallbackNotifier->start();
1426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( ALREADY_EXISTS == ret )
1428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Already running, do nothing
1430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("AppCallbackNotifier already running");
1431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_ERROR;
1432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( NO_ERROR == ret ) {
1434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Started AppCallbackNotifier..");
1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Couldn't start AppCallbackNotifier");
1440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Enable the display adapter if present, actual overlay enable happens when we post the buffer
1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() != NULL)
1445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Enabling display");
1447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        bool isS3d = false;
1448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        DisplayAdapter::S3DParameters s3dParams;
1449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int width, height;
1450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mParameters.getPreviewSize(&width, &height);
1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if 0 //TODO: s3d is not part of bringup...will reenable
1452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_SUPPORTED)) != NULL) {
1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            isS3d = (strcmp(valstr, "true") == 0);
1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL) {
1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (strcmp(valstr, "off") == 0)
1457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS OFF");
1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //TODO: obtain the frame packing configuration from camera or user settings
1460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //once side by side configuration is supported
1461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.mode = OVERLAY_S3D_MODE_ON;
1462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS ON");
1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.mode = OVERLAY_S3D_MODE_OFF;
1470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif //if 0
1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview, isS3d ? &s3dParams : NULL);
1480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
1482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->enableDisplay(width, height, NULL, isS3d ? &s3dParams : NULL);
1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( ret != NO_ERROR )
1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't enable display");
1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto error;
1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Send START_PREVIEW command to adapter
1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Starting CameraAdapter preview mode");
1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW);
1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(ret!=NO_ERROR)
1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter");
1503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Started preview");
1506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = true;
1508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStartInProgress = false;
1509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    error:
1512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Performing cleanup after error");
1514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Do all the cleanup
1516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        freePreviewBufs();
1517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
1518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayAdapter.get() != NULL)
1519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
15206b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng            mDisplayAdapter->disableDisplay(false);
1521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stop();
1523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewStartInProgress = false;
1524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewEnabled = false;
1525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Sets ANativeWindow object.
1532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it
1534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   to render buffers to display.
1535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] window The ANativeWindow object created by Surface flinger
1537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the ANativeWindow object passes validation criteria
1538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::setPreviewWindow(struct preview_stream_ops *window)
1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
1545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = true;
1548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter
1550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!window)
1551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayAdapter.get() != NULL)
1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///NULL window passed, destroy the display adapter if present
1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("NULL window passed, destroying display adapter");
1556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mDisplayAdapter.clear();
1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client
1558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@remarks so, we will wait until it passes a valid window to begin the preview again
1559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSetPreviewWindowCalled = false;
1560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("NULL ANativeWindow passed to setPreviewWindow");
1562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
1563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }else if(mDisplayAdapter.get() == NULL)
1564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Need to create the display adapter since it has not been created
1566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Create display adapter
1567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter = new ANativeWindowDisplayAdapter();
1568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_ERROR;
1569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR))
1570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if(ret!=NO_ERROR)
1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mDisplayAdapter.clear();
1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("DisplayAdapter initialize failed");
1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                LOG_FUNCTION_NAME_EXIT;
1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return ret;
1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("Couldn't create DisplayAdapter");
1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                LOG_FUNCTION_NAME_EXIT;
1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return NO_MEMORY;
1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // DisplayAdapter needs to know where to get the CameraFrames from inorder to display
1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter
1588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->setFrameProvider(mCameraAdapter);
1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Any dynamic errors that happen during the camera use case has to be propagated back to the application
1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Set it as the error handler for the DisplayAdapter
1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get());
1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Update the display adapter with the new window that is passed from CameraService
1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret  = mDisplayAdapter->setPreviewWindow(window);
1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(ret!=NO_ERROR)
1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mPreviewStartInProgress)
1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("setPreviewWindow called when preview running");
1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            // Start the preview since the window is now available
1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = startPreview();
1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }else
1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /* If mDisplayAdpater is already created. No need to do anything.
1611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         * We get a surface handle directly now, so we can reconfigure surface
1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         * itself in DisplayAdapter if dimensions have changed
1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         */
1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopPreview()
1630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled() && !mDisplayPaused)
1634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
16390e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman    bool imageCaptureRunning = (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE) &&
16400e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman                                    (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE);
16410e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman    if(mDisplayPaused && !imageCaptureRunning)
1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Display is paused, which essentially means there is no preview active.
1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Note: this is done so that when stopPreview is called by client after
1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // an image capture, we do not de-initialize the camera adapter and
1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // restart over again.
164797db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu
164897db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu        // Since we are not calling CameraAdapter->stopPreview, we need to
164997db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu        // explicitly release the 3A locks in this first level stopPreview call
165097db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu        // before returning
165197db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu        if ( NULL != mCameraAdapter ) {
165297db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu            CameraParameters adapterParams = mParameters;
165397db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu
165497db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu            adapterParams.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, CameraParameters::FALSE);
165597db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu            adapterParams.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, CameraParameters::FALSE);
165697db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu            mCameraAdapter->setParameters(adapterParams);
165797db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu        }
165897db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu
1659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
1660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    forceStopPreview();
1663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1664b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Reset Capture-Mode to default, so that when we switch from VideoRecording
1665b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE.
1666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Resetting Capture-Mode to default");
1667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
1668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if preview is enabled
1674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If preview is running currently
1677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If preview has been stopped
1678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::previewEnabled()
1681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return (mPreviewEnabled || mPreviewStartInProgress);
1685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start record mode.
1689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with
1691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  the corresponding frame. Every record frame must be released by calling
1692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  releaseRecordingFrame().
1693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If recording could be started without any issues
1696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update the header with possible error values in failure scenarios
1697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startRecording( )
1700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
1702b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
1703b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
1704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            gettimeofday(&mStartPreview, NULL);
1712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled())
1716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1720b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
1721b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if ( (valstr == NULL) ||
1722b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil         ( (valstr != NULL) && (strcmp(valstr, CameraParameters::TRUE) != 0) ) )
1723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1724b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = setVideoModeParameters();
1725b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1726b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(restartPreviewRequired)
1727b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1728b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ret = restartPreview();
1729b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS)));
1735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret = mAppCallbackNotifier->startRecording();
1740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter
1745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret =  mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO);
1746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecordingEnabled = true;
1751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters specific to Video Recording.
1760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function checks for the camera parameters which have to be set for recording.
1762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it.
1763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function also enables Video Recording specific functions like VSTAB & VNF.
1764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1766b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Modify the policies for enabling VSTAB & VNF usecase based later.
1768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1770b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilbool CameraHal::setVideoModeParameters()
1771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
1773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool restartPreviewRequired = false;
1774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (valstr == NULL) ||
1781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) ) )
1782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE");
1784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE);
1785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        restartPreviewRequired = true;
1786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1788cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    // Check if CAPTURE_MODE is VIDEO_MODE, since VSTAB & VNF work only in VIDEO_MODE.
1789cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1790cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    if (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0)
1791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1792cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // Enable VSTAB, if not enabled already
1793cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        valstr = mParameters.get(TICameraParameters::KEY_VSTAB);
1794cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        if ( (valstr == NULL) ||
1795cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            ( (valstr != NULL) && (strcmp(valstr, "1") != 0) ) )
1796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1797cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Enable VSTAB");
1798cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VSTAB, "1");
1799cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
1800cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            }
1801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1802cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // Enable VNF, if not enabled already
1803cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        valstr = mParameters.get(TICameraParameters::KEY_VNF);
1804cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        if ( (valstr == NULL) ||
1805cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            ( (valstr != NULL) && (strcmp(valstr, "1") != 0) ) )
1806cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            {
1807cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Enable VNF");
1808cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VNF, "1");
1809cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
1810cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            }
1811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1812cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU.
1813cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048.
1814cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution.
1815cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        valstr = mParameters.get(TICameraParameters::KEY_VSTAB);
1816cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        if ((valstr != NULL) && (strcmp(valstr, "1") == 0) && (mPreviewWidth == 1920))
1817cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            {
1818cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Force Enable VNF for 1080p");
1819cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VNF, "1");
1820cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
1821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1824b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
1825b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1826b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
1827b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
1828b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1829b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
1830b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Reset the camera parameters specific to Video Recording.
1831b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1832b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF.
1833b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1834b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
1835b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1836b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1837b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
1838b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilbool CameraHal::resetVideoModeParameters()
1839b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
1840b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
1841b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
1842b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
1843b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1844b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
1845b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1846d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    // ignore this if we are already recording
1847d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    if (mRecordingEnabled) {
1848d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu        return false;
1849d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    }
1850d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu
1851b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1852b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1853b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0) )
1854b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        {
1855b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Reset Capture-Mode to default");
1856b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
1857b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = true;
1858b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        }
1859b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1860b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Enable VSTAB, if not enabled already
1861b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_VSTAB);
1862b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if (  (valstr != NULL) && (strcmp(valstr, "1") == 0) )
1863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1864b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Disable VSTAB");
1865b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_VSTAB, "0");
1866b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = true;
1867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1869b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Enable VNF, if not enabled already
1870b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_VNF);
1871b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if (  (valstr != NULL) && (strcmp(valstr, "1") == 0) )
1872b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        {
1873b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Disable VNF");
1874b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_VNF, "0");
1875b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = true;
1876b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        }
1877b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1878b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
1879b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1880b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
1881b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
1882b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1883b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
1884b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Restart the preview with setParameter.
1885b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1886b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function restarts preview, for some VIDEO_MODE parameters to take effect.
1887b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1888b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
1889b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return NO_ERROR If recording parameters could be set without any issues
1890b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1891b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
1892b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilstatus_t CameraHal::restartPreview()
1893b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
1894b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
1895b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    char tmpvalstr[30];
1896b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
1897b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1898b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
1899b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1900b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview().
1901b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    tmpvalstr[0] = 0;
1902b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1903b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if(valstr != NULL)
1904b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        {
1905b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(sizeof(tmpvalstr) < (strlen(valstr)+1))
1906b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1907b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            return -EINVAL;
1908b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1909b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1910e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman        strncpy(tmpvalstr, valstr, sizeof(tmpvalstr));
1911b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        tmpvalstr[sizeof(tmpvalstr)-1] = 0;
1912b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        }
1913b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1914b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    stopPreview();
1915b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1916b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    {
1917b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        Mutex::Autolock lock(mLock);
1918b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_CAP_MODE, tmpvalstr);
1919b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mCameraAdapter->setParameters(mParameters);
1920b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
1921b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1922b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    ret = startPreview();
1923b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started recording.
1931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
1934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopRecording()
1937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
19387d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    CameraAdapter::AdapterState currentState;
19397d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
1940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19427d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    Mutex::Autolock lock(mLock);
19437d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
1944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!mRecordingEnabled )
1945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
1947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19497d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    currentState = mCameraAdapter->getState();
19507d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) {
19517d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
19527d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    }
19537d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
1954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->stopRecording();
1955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO);
1957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
1959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if recording is enabled.
1965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If recording is currently running
1968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If recording has been stopped
1969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::recordingEnabled()
1972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mRecordingEnabled;
1978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
1982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers
1984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               previously given by CameraHal
1985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
1986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::releaseRecordingFrame(const void* mem)
1989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //CAMHAL_LOGDB(" 0x%x", mem->pointer());
1993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( mRecordingEnabled ) && mem != NULL)
1995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->releaseRecordingFrame(mem);
1997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return;
2002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start auto focus
2006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This call asynchronous.
2008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   The notification callback routine is called with CAMERA_MSG_FOCUS once when
2009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focusing is complete. autoFocus() will be called again if another auto focus is
2010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   needed.
2011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
2014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes if the focus is not locked
2015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::autoFocus()
2018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&mStartFocus, NULL);
2024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter )
2031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //pass the autoFocus timestamp along with the command to camera adapter
2036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus);
2037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS);
2041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
2048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancels auto-focus function.
2057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   If the auto-focus is still in progress, this function will cancel it.
2059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Whether the auto-focus is in progress or not, this function will return the
2060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focus position to the default. If the camera does not support auto-focus, this is a no-op.
2061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the cancel succeeded
2065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if cancel didnt succeed
2066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelAutoFocus()
2069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
2072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
2074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier)
2080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
2085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
2088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
2089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay);
2092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == mEventProvider )
2093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error in creating EventProvider");
2095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->enableEventNotification(eventMask);
2099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallbackRelay(CameraHalEvent* event)
2105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHal *appcbn = ( CameraHal * ) (event->mCookie);
2109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    appcbn->eventCallback(event );
2110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallback(CameraHalEvent* event)
2115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != event )
2119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch( event->mEventType )
2121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CameraHalEvent::EVENT_FOCUS_LOCKED:
2123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CameraHalEvent::EVENT_FOCUS_ERROR:
2124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( mBracketingEnabled )
2126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
2127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    startImageBracketing();
2128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
2129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
2132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
2136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startImageBracketing()
2142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        status_t ret = NO_ERROR;
2144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraFrame frame;
2145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraAdapter::BuffersDescriptor desc;
2146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartCapture, NULL);
2150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
2154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!previewEnabled() && !mDisplayPaused)
2156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            LOG_FUNCTION_NAME_EXIT;
2158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
2159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( !mBracketingEnabled )
2162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
2164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingRunning = true;
2169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &frame,
2175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( mBracketRangeNegative + 1 ));
2176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != mAppCallbackNotifier.get() )
2186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
2188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mParameters.getPictureSize(( int * ) &frame.mWidth,
2194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                       ( int * ) &frame.mHeight);
2195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = allocImageBufs(frame.mWidth,
2197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mHeight,
2198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mLength,
2199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mParameters.getPictureFormat(),
2200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 ( mBracketRangeNegative + 1 ));
2201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
2204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mImageBufs;
2211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
2212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
2213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
2214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 );
2215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = ( size_t ) ( mBracketRangeNegative + 1 );
2216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
2219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
2221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 //pass capture timestamp along with the camera adapter command
2226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE,  ( mBracketRangePositive + 1 ),  (int) &mStartCapture);
2227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ));
2231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
2238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::stopImageBracketing()
2241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        status_t ret = NO_ERROR;
2243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
2245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( !mBracketingRunning )
2247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
2249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingRunning = false;
2254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!previewEnabled() && !mDisplayPaused)
2257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
2259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE);
2264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
2269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Take a picture.
2273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If able to switch to image capture
2276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if unable to switch to image capture
2277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::takePicture( )
2280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
2283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
2284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int burst;
2285ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    const char *valstr = NULL;
2286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int bufferCount = 1;
2287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&mStartCapture, NULL);
2293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled() && !mDisplayPaused)
2299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2301ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Preview not started...");
2302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
2303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2305ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // return error if we are already capturing
2306ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE &&
2307ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu          mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) ||
2308ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE &&
2309ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu          mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE) ) {
2310ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Already capturing an image...");
2311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
2312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2314ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // we only support video snapshot if we are in video mode (recording hint is set)
2315ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2316ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) &&
2317ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (valstr && strcmp(valstr, TICameraParameters::VIDEO_MODE)) ) {
2318ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Trying to capture while recording without recording hint set...");
2319ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        return INVALID_OPERATION;
2320ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
2321ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( !mBracketingRunning )
2323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if ( NO_ERROR == ret )
2326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            burst = mParameters.getInt(TICameraParameters::KEY_BURST);
2328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //Allocate all buffers only in burst capture case
2331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if ( burst > 1 )
2332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
2333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             bufferCount = CameraHal::NO_BUFFERS_IMAGE_CAPTURE;
2334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( NULL != mAppCallbackNotifier.get() )
2335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
2337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
2339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         else
2340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
2341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( NULL != mAppCallbackNotifier.get() )
2342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(false);
2344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
2346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2347ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // pause preview during normal image capture
2348ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // do not pause preview if recording (video state)
2349ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if (NO_ERROR == ret &&
2350ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                NULL != mDisplayAdapter.get() &&
2351ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                burst < 1) {
2352ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) {
2353ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mDisplayPaused = true;
2354ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mPreviewEnabled = false;
2355ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
2356ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                // since preview is paused we should stop sending preview frames too
2357ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
2358ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME);
2359ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                }
2360ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            }
2361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mDisplayAdapter->setSnapshotTimeRef(&mStartCapture);
2364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2365ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        }
2366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2367ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) )
2368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
2370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  ( int ) &frame,
2372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  bufferCount);
2373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mParameters.getPictureSize(( int * ) &frame.mWidth,
2383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                       ( int * ) &frame.mHeight);
2384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = allocImageBufs(frame.mWidth,
2386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mHeight,
2387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mLength,
2388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mParameters.getPictureFormat(),
2389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 bufferCount);
2390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
2393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mImageBufs;
2399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
2400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
2401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
2402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) bufferCount;
2403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = ( size_t ) bufferCount;
2404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
2407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBracketingRunning = false;
2412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( NULL != mCameraAdapter ) )
2415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //pass capture timestamp along with the camera adapter command
2420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,  (int) &mStartCapture);
2421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
2425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancel a picture that was started with takePicture.
2435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Calling this method when no picture is being taken is a no-op.
2437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent
2440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
2441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelPicture( )
2444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
2450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Return the camera parameters.
2456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return Currently configured camera parameters
2459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar* CameraHal::getParameters()
2462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    String8 params_str8;
2464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char* params_string;
2465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
2469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2470f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        mCameraAdapter->getParameters(mParameters);
2471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2473524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
2474f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    params_str8 = mParameters.flatten();
2475524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
2476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // camera service frees this string...
2477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params_string = (char*) malloc(sizeof(char) * (params_str8.length()+1));
2478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    strcpy(params_string, params_str8.string());
2479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Return the current set of parameters
2483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return params_string;
2485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::putParameters(char *parms)
2488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    free(parms);
2490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Send command to camera driver.
2494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the command succeeds
2497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes that this function can return
2498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
2501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) )
2508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("No CameraAdapter instance");
2510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
2511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( !previewEnabled() ))
2514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Preview is not running");
2516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
2517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
2520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch(cmd)
2522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_SMOOTH_ZOOM:
2524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1);
2526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_SMOOTH_ZOOM:
2529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM);
2531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_FACE_DETECTION:
2533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD);
2535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_FACE_DETECTION:
2539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
2541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
2545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
2547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release the hardware resources owned by this object.
2556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Note that this is *not* done in the destructor.
2558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::release()
2564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@todo Investigate on how release is used by CameraService. Vaguely remember that this is called
2567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///just before CameraHal object destruction
2568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
2569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Dump state of the camera hardware
2575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] fd    File descriptor
2577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] args  Arguments
2578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Dump succeeded
2579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo  Error codes for dump fail
2580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t  CameraHal::dump(int fd) const
2583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Implement this method when the h/w dump function is supported on Ducati side
2586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Interface Method definitions ENDS here--------------------*/
2590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Internal Method definitions STARTS here--------------------*/
2595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Constructor of CameraHal
2598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Member variables are initialized here.  No allocations should be done here as we
2600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   don't use c++ exceptions in the code.
2601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::CameraHal(int cameraId)
2604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize all the member variables to their defaults
2608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
2609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewBufs = NULL;
2610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageBufs = NULL;
2611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBufProvider = NULL;
2612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStartInProgress = false;
2613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBufs = NULL;
2614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBufProvider = NULL;
2615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
2616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
2617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
2618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMsgEnabled = 0;
2619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier = NULL;
2620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMemoryManager = NULL;
2621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter = NULL;
2622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingEnabled = false;
2623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingRunning = false;
2624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = NULL;
2625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangePositive = 1;
2626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangeNegative = 1;
2627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = 0;
2628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mShutterEnabled = true;
2629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMeasurementEnabled = false;
2630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataBufs = NULL;
2631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = NULL;
2632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCurrentTime = 0;
2633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mFalsePreview = 0;
2634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageOffsets = NULL;
2635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageLength = 0;
2636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageFd = 0;
2637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoOffsets = NULL;
2638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoFd = 0;
2639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoLength = 0;
2640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataOffsets = NULL;
2641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataFd = 0;
2642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataLength = 0;
2643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewFd = 0;
2644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewWidth = 0;
2645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewHeight = 0;
2646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewLength = 0;
2647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewOffsets = NULL;
2648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewRunning = 0;
2649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStateOld = 0;
2650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = 0;
2651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordEnabled = 0;
2652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = NULL;
26533a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu    mDynamicPreviewSwitch = false;
2654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Initialize the CameraHAL constructor timestamp, which is used in the
2658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // PPM() method as time reference if the user does not supply one.
2659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&ppm_start, NULL);
2660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraIndex = cameraId;
2664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Destructor of CameraHal
2670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function simply calls deinitialize() to free up memory allocate during construct
2672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   phase
2673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::~CameraHal()
2675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Call de-initialize here once more - it is the last chance for us to relinquish all the h/w and s/w resources
2679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
2680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
2682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
2685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
2686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the callback notifier
2689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier.clear();
2690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the display adapter
2692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayAdapter.clear();
2693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
2695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int strongCount = mCameraAdapter->getStrongCount();
2696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->decStrong(mCameraAdapter);
2698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
2700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2702de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    freeImageBufs();
2703de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
2704de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    /// Free the memory manager
2705de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    mMemoryManager.clear();
2706de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
2707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Initialize the Camera HAL
2712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Creates CameraAdapter, AppCallbackNotifier, DisplayAdapter and MemoryManager
2714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param None
2716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR - On success
2717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         NO_MEMORY - On failure to allocate memory for any of the objects
2718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @remarks Camera Hal internal function
2719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::initialize(CameraProperties::Properties* properties)
2723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int sensor_index = 0;
2727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize the event mask used for registering an event provider for AppCallbackNotifier
2729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Currently, registering all events as to be coming from CameraAdapter
2730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int32_t eventMask = CameraHalEvent::ALL_EVENTS;
2731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Get my camera properties
2733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = properties;
2734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mCameraProperties)
2736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Dump the properties of this Camera
2741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // will only print if DEBUG macro is defined
2742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties->dump();
2743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)) != 0 )
2745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        sensor_index = atoi(mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX));
2747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Sensor index %d", sensor_index);
2750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter = CameraAdapter_Factory();
2752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NULL == mCameraAdapter ) || (mCameraAdapter->initialize(properties, sensor_index)!=NO_ERROR))
2753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Unable to create or initialize CameraAdapter");
2755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
2756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->incStrong(mCameraAdapter);
2760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerImageReleaseCallback(releaseImageBuffers, (void *) this);
2761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerEndCaptureCallback(endImageCapture, (void *)this);
2762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mAppCallbackNotifier.get())
2764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create the callback notifier
2766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier = new AppCallbackNotifier();
2767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mAppCallbackNotifier.get() ) || ( mAppCallbackNotifier->initialize() != NO_ERROR))
2768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize AppCallbackNotifier");
2770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
2771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mMemoryManager.get())
2775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create Memory Manager
2777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mMemoryManager = new MemoryManager();
2778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mMemoryManager.get() ) || ( mMemoryManager->initialize() != NO_ERROR))
2779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize MemoryManager");
2781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
2782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Setup the class dependencies...
2786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///AppCallbackNotifier has to know where to get the Camera frames and the events like auto focus lock etc from.
2788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///CameraAdapter is the one which provides those events
2789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the frame and event providers for AppCallbackNotifier
2790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@remarks  setEventProvider API takes in a bit mask of events for registering a provider for the different events
2791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         That way, if events can come from DisplayAdapter in future, we will be able to add it as provider
2792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         for any event
2793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setEventProvider(eventMask, mCameraAdapter);
2794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setFrameProvider(mCameraAdapter);
2795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Any dynamic errors that happen during the camera use case has to be propagated back to the application
2797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
2798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the error handler for CameraAdapter
2799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->setErrorHandler(mAppCallbackNotifier.get());
2800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
2802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier->start() != NO_ERROR)
2803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      {
2804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't start AppCallbackNotifier");
2805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      }
2807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Started AppCallbackNotifier..");
2809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
2810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize default parameters
2812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    initDefaultParameters();
2813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( setParameters(mParameters) != NO_ERROR )
2816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Failed to set default parameters?!");
2818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // register for sensor events
2821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = new SensorListener();
2822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
2823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (mSensorListener->initialize() == NO_ERROR) {
2824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->setCallbacks(orientation_cb, this);
2825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->enableSensor(SensorListener::SENSOR_ORIENTATION);
2826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        } else {
2827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Error initializing SensorListener. not fatal, continuing");
2828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener.clear();
2829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener = NULL;
2830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fail_loop:
2838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Free up the resources because we failed somewhere up
2840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        deinitialize();
2841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
2844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions)
2848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
2850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status = NO_ERROR;
2851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
2852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
2853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedResolutions )
2857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported resolutions string");
2859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
2860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
2861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status = snprintf(tmpBuffer, PARAM_BUFFER, "%dx%d", width, height);
2864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 > status )
2865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
2867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
2868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
2869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedResolutions, tmpBuffer);
2872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
2873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
2875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
2879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
2882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(const char *param, const char *supportedParams)
2889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
2891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
2892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedParams )
2896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
2898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
2899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
2900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == param )
2903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid parameter string");
2905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
2906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
2907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedParams, param);
2910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
2911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
2913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
2917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
2920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(int param, const char *supportedParams)
2927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
2929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
2930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status;
2931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
2932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedParams )
2936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
2938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
2939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
2940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status = snprintf(tmpBuffer, PARAM_BUFFER, "%d", param);
2943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 > status )
2944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
2946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
2947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
2948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedParams, tmpBuffer);
2951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
2952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
2954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
2958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
2961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2967f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luustatus_t CameraHal::doesSetParameterNeedUpdate(const char* new_param, const char* old_param, bool& update) {
2968f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if (!new_param || !old_param) {
2969f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        return -EINVAL;
2970f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
2971f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
2972f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    // if params mismatch we should update parameters for camera adapter
2973f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if ((strcmp(new_param, old_param) != 0)) {
2974f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu       update = true;
2975f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
2976f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
2977f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu   return NO_ERROR;
2978f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu}
2979f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
2980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::parseResolution(const char *resStr, int &width, int &height)
2981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *ctx, *pWidth, *pHeight;
2984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *sep = "x";
2985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *tmp = NULL;
2986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == resStr )
2990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
2992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //This fixes "Invalid input resolution"
2995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *resStr_copy = (char *)malloc(strlen(resStr) + 1);
2996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL!=resStr_copy ) {
2997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
2998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        strcpy(resStr_copy, resStr);
3000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pWidth = strtok_r( (char *) resStr_copy, sep, &ctx);
3001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pWidth )
3003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            width = atoi(pWidth);
3005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
3007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
3010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pHeight = strtok_r(NULL, sep, &ctx);
3016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pHeight )
3018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            height = atoi(pHeight);
3020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
3022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
3025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        free(resStr_copy);
3029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        resStr_copy = NULL;
3030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     }
3031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::insertSupportedParams()
3037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters &p = mParameters;
3043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set the name of the camera
3045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CAMERA_NAME, mCameraProperties->get(CameraProperties::CAMERA_NAME));
3046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = atoi(mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES));
3050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS));
3051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES));
3052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
3053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
3054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_THUMBNAIL_SIZES));
3055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE));
3056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_EFFECTS, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS));
3057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES));
3059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES));
3060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING));
3061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MAX));
3062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MIN));
3063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_EV_STEP));
3064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES));
3066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_ISO_VALUES, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES));
3067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM_RATIOS, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_RATIOS));
3068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_ZOOM, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::ZOOM_SUPPORTED));
3070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::SMOOTH_ZOOM_SUPPORTED));
3071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_IPP, mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES));
3072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D_SUPPORTED,mCameraProperties->get(CameraProperties::S3D_SUPPORTED));
3073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D2D_PREVIEW_MODE,mCameraProperties->get(CameraProperties::S3D2D_PREVIEW_MODES));
3074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE));
3075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
3076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_VSTAB,mCameraProperties->get(CameraProperties::VSTAB));
3077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_VSTAB_VALUES,mCameraProperties->get(CameraProperties::VSTAB_VALUES));
3078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
3079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED));
3082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED));
30839919dafce4d57f0b9b9aedafc95b756464685009Tyler Luu    p.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, mCameraProperties->get(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED));
3084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::initDefaultParameters()
3090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Purpose of this function is to initialize the default current and supported parameters for the currently
3092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //selected camera.
3093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters &p = mParameters;
3095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentRevision, adapterRevision;
3096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
3097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int width, height;
3098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PREVIEW_SIZE), width, height);
3102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(width, height);
3106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT);
3110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PICTURE_SIZE), width, height);
3113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(width, height);
3117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(PICTURE_WIDTH, PICTURE_HEIGHT);
3121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_SIZE), width, height);
3124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width);
3128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height);
3129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, MIN_WIDTH);
3133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, MIN_HEIGHT);
3134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    insertSupportedParams();
3137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Insert default values
3139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFrameRate(atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)));
3140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFormat(mCameraProperties->get(CameraProperties::PREVIEW_FORMAT));
3141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPictureFormat(mCameraProperties->get(CameraProperties::PICTURE_FORMAT));
3142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_JPEG_QUALITY, mCameraProperties->get(CameraProperties::JPEG_QUALITY));
3143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_WHITE_BALANCE, mCameraProperties->get(CameraProperties::WHITEBALANCE));
3144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EFFECT,  mCameraProperties->get(CameraProperties::EFFECT));
3145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ANTIBANDING, mCameraProperties->get(CameraProperties::ANTIBANDING));
3146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FOCUS_MODE, mCameraProperties->get(CameraProperties::FOCUS_MODE));
3148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::EV_COMPENSATION));
3149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SCENE_MODE, mCameraProperties->get(CameraProperties::SCENE_MODE));
3150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM, mCameraProperties->get(CameraProperties::ZOOM));
3152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CONTRAST, mCameraProperties->get(CameraProperties::CONTRAST));
3153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SATURATION, mCameraProperties->get(CameraProperties::SATURATION));
3154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_BRIGHTNESS, mCameraProperties->get(CameraProperties::BRIGHTNESS));
3155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SHARPNESS, mCameraProperties->get(CameraProperties::SHARPNESS));
3156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXPOSURE_MODE, mCameraProperties->get(CameraProperties::EXPOSURE_MODE));
3157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_ISO, mCameraProperties->get(CameraProperties::ISO_MODE));
3158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_IPP, mCameraProperties->get(CameraProperties::IPP));
3159d054c26243e4cf49e5fe04789e4437e5e0f3f574Sundar Raman    p.set(TICameraParameters::KEY_GBCE, mCameraProperties->get(CameraProperties::GBCE));
3160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D2D_PREVIEW, mCameraProperties->get(CameraProperties::S3D2D_PREVIEW));
3161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_AUTOCONVERGENCE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE));
3162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
3163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_VSTAB,mCameraProperties->get(CameraProperties::VSTAB));
3164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_VSTAB_VALUES,mCameraProperties->get(CameraProperties::VSTAB_VALUES));
3165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FOCAL_LENGTH, mCameraProperties->get(CameraProperties::FOCAL_LENGTH));
3166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::HOR_ANGLE));
3167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::VER_ANGLE));
3168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
3169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MAKE, mCameraProperties->get(CameraProperties::EXIF_MAKE));
3172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MODEL, mCameraProperties->get(CameraProperties::EXIF_MODEL));
3173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_QUALITY));
3174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, "OMX_TI_COLOR_FormatYUV420PackedSemiPlanar");
3175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, mCameraProperties->get(CameraProperties::MAX_FD_HW_FACES));
3176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, mCameraProperties->get(CameraProperties::MAX_FD_SW_FACES));
3177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Only one area a.k.a Touch AF for now.
3179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // TODO: Add support for multiple focus areas.
3180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, mCameraProperties->get(CameraProperties::MAX_FOCUS_AREAS));
3181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK));
3182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK));
3183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, mCameraProperties->get(CameraProperties::MAX_NUM_METERING_AREAS));
3184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
3190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
3192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::forceStopPreview()
3195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // stop bracketing if it is running
3199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    stopImageBracketing();
3200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() != NULL) {
3202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Stop the buffer display first
3203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->disableDisplay();
3204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier.get() != NULL) {
3207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Stop the callback sending
3208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stop();
320926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu        mAppCallbackNotifier->flushAndReturnFrames();
3210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stopPreviewCallbacks();
3211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
3214342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        CameraAdapter::AdapterState currentState;
3215342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        CameraAdapter::AdapterState nextState;
3216aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
3217342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        currentState = mCameraAdapter->getState();
3218342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        nextState = mCameraAdapter->getNextState();
3219aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
3220342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // since prerequisite for capturing is for camera system
3221342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // to be previewing...cancel all captures before stopping
3222342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // preview
3223342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        if ( (currentState == CameraAdapter::CAPTURE_STATE) &&
3224342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu             (nextState != CameraAdapter::PREVIEW_STATE)) {
3225342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
3226342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
3227342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu
3228342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // only need to send these control commands to state machine if we are
3229342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // passed the LOADED_PREVIEW_STATE
3230342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        if (currentState > CameraAdapter::LOADED_PREVIEW_STATE) {
3231342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // according to javadoc...FD should be stopped in stopPreview
3232342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // and application needs to call startFaceDection again
3233342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // to restart FD
3234342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
3235342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu
3236342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           cancelAutoFocus();
3237342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
3238342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu
3239342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // only need to send these control commands to state machine if we are
3240342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // passed the INITIALIZED_STATE
3241342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        if (currentState > CameraAdapter::INTIALIZED_STATE) {
3242342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           //Stop the source of frames
3243342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
3244342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
3245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewBufs();
3248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewDataBufs();
3249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
3251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
3252342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu    mPreviewStartInProgress = false;
3253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Deallocates memory for all the resources held by Camera HAL.
3259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter,
3261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   and Memory Manager
3262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
3265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::deinitialize()
3268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3271f5094850dd99854af026e16bd21d8555a5168afbSundar Raman    if ( mPreviewEnabled || mDisplayPaused ) {
3272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        forceStopPreview();
3273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
3276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
3278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION);
3279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener.clear();
3280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener = NULL;
3281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::storeMetaDataInBuffers(bool enable)
3288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mAppCallbackNotifier->useMetaDataBufferMode(enable);
3292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3296a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boatengvoid CameraHal::selectFPSRange(int framerate, int *min_fps, int *max_fps)
3297a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng{
3298a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  char * ptr;
3299a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  char supported[MAX_PROP_VALUE_LENGTH];
3300a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  int fpsrangeArray[2];
3301a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  int i = 0;
3302a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3303a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  LOG_FUNCTION_NAME;
3304a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  size_t size = strlen(mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))+1;
3305a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  strncpy(supported, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED), size);
3306a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3307a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  ptr = strtok (supported," (,)");
3308a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3309a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  while (ptr != NULL)
3310a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng    {
3311a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      fpsrangeArray[i]= atoi(ptr)/CameraHal::VFR_SCALE;
3312a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      if (i == 1)
3313a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng        {
3314a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          if (framerate == fpsrangeArray[i])
3315a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng            {
3316a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              CAMHAL_LOGDB("SETTING FPS RANGE min = %d max = %d \n", fpsrangeArray[0], fpsrangeArray[1]);
3317a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              *min_fps = fpsrangeArray[0];
3318a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              *max_fps = fpsrangeArray[1];
3319a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              break;
3320a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng            }
3321a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng        }
3322a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      ptr = strtok (NULL, " (,)");
3323a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      i++;
3324a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      i%=2;
3325a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng    }
3326a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3327a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
3328a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3329a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng}
3330a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
3332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3334