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