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