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