CameraHal.cpp revision 41a31123a0fc59b8112460285d3f1ba73c5537c0
1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*
2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (C) Texas Instruments - http://www.ti.com/
3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License");
5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * you may not use this file except in compliance with the License.
6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * You may obtain a copy of the License at
7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *      http://www.apache.org/licenses/LICENSE-2.0
9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *
10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Unless required by applicable law or agreed to in writing, software
11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS,
12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * See the License for the specific language governing permissions and
14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * limitations under the License.
15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @file CameraHal.cpp
19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* This file maps the Camera Hardware Interface to V4L2.
21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*
22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*/
23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define LOG_TAG "CameraHAL"
25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraHal.h"
27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "ANativeWindowDisplayAdapter.h"
28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "TICameraParameters.h"
29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraProperties.h"
30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <cutils/properties.h>
31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <poll.h>
33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <math.h>
34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevnamespace android {
36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
379a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luuextern "C" CameraAdapter* CameraAdapter_Factory(size_t);
38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*****************************************************************************/
40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev////Constant definitions and declarations
42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev////@todo Have a CameraProperties class to store these parameters as constants for every camera
43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev////       Currently, they are hard-coded
44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst int CameraHal::NO_BUFFERS_PREVIEW = MAX_CAMERA_BUFFERS;
46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst int CameraHal::NO_BUFFERS_IMAGE_CAPTURE = 2;
47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst uint32_t MessageNotifier::EVENT_BIT_FIELD_POSITION = 0;
49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst uint32_t MessageNotifier::FRAME_BIT_FIELD_POSITION = 0;
50c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************************************************************/
52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
54c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
55c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartPreview;
56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartFocus;
57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartCapture;
58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void orientation_cb(uint32_t orientation, uint32_t tilt, void* cookie) {
62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHal *camera = NULL;
63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (cookie) {
65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera = (CameraHal*) cookie;
66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        camera->onOrientationEvent(orientation, tilt);
67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Interface Method definitions STARTS here--------------------*/
71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  Callback function to receive orientation events from SensorListener
74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::onOrientationEvent(uint32_t orientation, uint32_t tilt) {
76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->onOrientationEvent(orientation, tilt);
80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the notification and data callbacks
87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] notify_cb Notify callback for notifying the app about events and errors
89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] data_cb   Buffer callback for sending the preview/raw frames to the app
90c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] data_cb_timestamp Buffer callback for sending the video frames w/ timestamp
91c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] user  Callback cookie
92c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::setCallbacks(camera_notify_callback notify_cb,
96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            camera_data_callback data_cb,
97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            camera_data_timestamp_callback data_cb_timestamp,
98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            camera_request_memory get_memory,
99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                            void *user)
100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mAppCallbackNotifier.get() )
104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mAppCallbackNotifier->setCallbacks(this,
106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                notify_cb,
107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                data_cb,
108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                data_cb_timestamp,
109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                get_memory,
110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                user);
111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Enable a message, or set of messages.
118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] msgtype Bitmask of the messages to enable (defined in include/ui/Camera.h)
120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::enableMsgType(int32_t msgType)
124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( msgType & CAMERA_MSG_SHUTTER ) && ( !mShutterEnabled ) )
128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        msgType &= ~CAMERA_MSG_SHUTTER;
130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1322ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    // ignoring enable focus message from camera service
1332ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    // we will enable internally in autoFocus call
134057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    msgType &= ~(CAMERA_MSG_FOCUS | CAMERA_MSG_FOCUS_MOVE);
1352ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMsgEnabled |= msgType;
139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayPaused)
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Preview currently paused...will enable preview callback when restarted");
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            msgType &= ~CAMERA_MSG_PREVIEW_FRAME;
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }else
148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Enabling Preview Callback");
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Preview callback not enabled %x", msgType);
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Configure app callback notifier with the message callback required
159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->enableMsgType (msgType);
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Disable a message, or set of messages.
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] msgtype Bitmask of the messages to disable (defined in include/ui/Camera.h)
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::disableMsgType(int32_t msgType)
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        Mutex::Autolock lock(mLock);
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mMsgEnabled &= ~msgType;
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( msgType & CAMERA_MSG_PREVIEW_FRAME)
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Disabling Preview Callback");
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Configure app callback notifier
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->disableMsgType (msgType);
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Query whether a message, or a set of messages, is enabled.
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Note that this is operates as an AND, if any of the messages queried are off, this will
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   return false.
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] msgtype Bitmask of the messages to query (defined in include/ui/Camera.h)
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If all message types are enabled
199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          false If any message type
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::msgTypeEnabled(int32_t msgType)
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return (mMsgEnabled & msgType);
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters.
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] params Camera parameters to configure the camera
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::setParameters(const char* parameters)
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   LOG_FUNCTION_NAME;
222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters params;
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    String8 str_params(parameters);
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.unflatten(str_params);
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return setParameters(params);
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters.
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] params Camera parameters to configure the camera
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::setParameters(const CameraParameters& params)
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   LOG_FUNCTION_NAME;
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w_orig, h_orig;
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int framerate,minframerate;
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int maxFPS, minFPS;
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int error;
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int base;
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *prevFormat;
254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *af_coord;
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    TIUTILS::Message msg;
256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
257b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Needed for KEY_RECORDING_HINT
258b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
259f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    bool updateRequired = false;
260b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    CameraParameters oldParams(mParameters.flatten());
261381ec2390c3d9d6ba3b67cf53e69fec96e7a7bd1Akwasi Boateng    bool videoMode = false;
262524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman    char range[MAX_PROP_VALUE_LENGTH];
263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
264b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    {
265b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        Mutex::Autolock lock(mLock);
266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
267b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Ensure that preview is not enabled when the below parameters are changed.
268b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(!previewEnabled())
269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
271b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("PreviewFormat %s", params.getPreviewFormat());
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2733a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ((valstr = params.getPreviewFormat()) != NULL) {
2743a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS))) {
2753a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    mParameters.setPreviewFormat(valstr);
2763a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                } else {
2773a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    CAMHAL_LOGEB("Invalid preview format.Supported: %s",  mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
2783a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    return -EINVAL;
279b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
2803a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
281b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
282f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((valstr = params.get(TICameraParameters::KEY_VNF)) != NULL) {
283f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                if ( (params.getInt(TICameraParameters::KEY_VNF)==0) || (params.getInt(TICameraParameters::KEY_VNF)==1) ) {
284f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGDB("VNF set %s", params.get(TICameraParameters::KEY_VNF));
285f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    mParameters.set(TICameraParameters::KEY_VNF, valstr);
286f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                } else {
287f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid VNF: %s", valstr);
288f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    ret = -EINVAL;
289b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
290f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
291b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2928b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            if ((valstr = params.get(CameraParameters::KEY_VIDEO_STABILIZATION)) != NULL) {
2938b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                // make sure we support vstab...if we don't and application is trying to set
2948b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                // vstab then return an error
2958b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
2968b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                           CameraParameters::TRUE) == 0) {
2978b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                    CAMHAL_LOGDB("VSTAB %s",
2988b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                                  params.get(CameraParameters::KEY_VIDEO_STABILIZATION));
2998b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                    mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION,
3008b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                                    params.get(CameraParameters::KEY_VIDEO_STABILIZATION));
3018b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                } else if (strcmp(valstr, CameraParameters::TRUE) == 0) {
302f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid VSTAB: %s", valstr);
303f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    ret = -EINVAL;
3048b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                } else {
3058b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                    mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION,
3068b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                                    CameraParameters::FALSE);
307b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
308f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
309b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
310b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL)
311b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
312b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Capture mode set %s", params.get(TICameraParameters::KEY_CAP_MODE));
313b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_CAP_MODE, valstr);
314b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
315b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
316f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((valstr = params.get(TICameraParameters::KEY_IPP)) != NULL) {
317f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES))) {
318f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGDB("IPP mode set %s", params.get(TICameraParameters::KEY_IPP));
319f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    mParameters.set(TICameraParameters::KEY_IPP, valstr);
320f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                } else {
321f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid IPP mode: %s", valstr);
322f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    ret = -EINVAL;
323b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
324f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
325b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
326b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if((valstr = params.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL)
327b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
328b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Stereo 3D->2D Preview mode is %s", params.get(TICameraParameters::KEY_S3D2D_PREVIEW));
329b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_S3D2D_PREVIEW, valstr);
330b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
331b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
332b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if((valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL)
333b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
334b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("AutoConvergence mode is %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE));
335b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr);
336b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
337b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
338b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
339b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
3403a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            params.getPreviewSize(&w, &h);
3413a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if (w == -1 && h == -1) {
3423a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEA("Unable to get preview size");
3433a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                return -EINVAL;
3443a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              }
3453a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3463a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            int oldWidth, oldHeight;
3473a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            mParameters.getPreviewSize(&oldWidth, &oldHeight);
3483a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3493a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            int orientation =0;
3503a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if((valstr = params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)) != NULL)
3513a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3523a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGDB("Sensor Orientation is set to %s", params.get(TICameraParameters::KEY_SENSOR_ORIENTATION));
3533a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.set(TICameraParameters::KEY_SENSOR_ORIENTATION, valstr);
3543a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                orientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION);
3553a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3563a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3573a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if(orientation ==90 || orientation ==270)
3583a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           {
3593a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              if ( !isResolutionValid(h,w, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
3603a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               {
3613a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
3623a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                return -EINVAL;
3633a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               }
3643a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              else
3653a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              {
3663a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.setPreviewSize(w, h);
36772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoWidth = w;
36872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoHeight = h;
3693a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               }
3703a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           }
3713a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           else
3723a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           {
3733a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ( !isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
3743a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3753a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
3763a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                return -EINVAL;
3773a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3783a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            else
3793a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3803a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.setPreviewSize(w, h);
3813a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3823a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           }
3833a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3843a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ( ( oldWidth != w ) || ( oldHeight != h ) )
3853a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
386ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu                restartPreviewRequired |= true;
3873a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3883a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3893a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            CAMHAL_LOGDB("PreviewResolution by App %d x %d", w, h);
3903a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
391b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
392b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        valstr = params.get(CameraParameters::KEY_RECORDING_HINT);
393b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(valstr != NULL)
394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
395b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if(strcmp(valstr, CameraParameters::TRUE) == 0)
396b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
397b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
398b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
399381ec2390c3d9d6ba3b67cf53e69fec96e7a7bd1Akwasi Boateng                videoMode = true;
40072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                int w, h;
40172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
40272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                params.getPreviewSize(&w, &h);
40372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Preview Width=%d Height=%d\n", __FUNCTION__, w, h);
40472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                //HACK FOR MMS
40572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoWidth = w;
40672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoHeight = h;
40772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Video Width=%d Height=%d\n", __FUNCTION__, mVideoWidth, mVideoHeight);
40872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
40972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                setPreferredPreviewRes(w, h);
41072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mParameters.getPreviewSize(&w, &h);
41172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Preview Width=%d Height=%d\n", __FUNCTION__, w, h);
4123dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                //Avoid restarting preview for MMS HACK
4133dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                if ((w != mVideoWidth) && (h != mVideoHeight))
4143dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                    {
4153dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                    restartPreviewRequired = false;
4163dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                    }
41772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
4183dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                restartPreviewRequired |= setVideoModeParameters(params);
419b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
420b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else if(strcmp(valstr, CameraParameters::FALSE) == 0)
421b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
422b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
423b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
424ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu                restartPreviewRequired |= resetVideoModeParameters();
42572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                params.getPreviewSize(&mVideoWidth, &mVideoHeight);
426b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
427b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
428b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
429b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGEA("Invalid RECORDING_HINT");
430b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                return -EINVAL;
431b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
435b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // This check is required in following case.
436b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // If VideoRecording activity sets KEY_RECORDING_HINT to TRUE and
437b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // ImageCapture activity doesnot set KEY_RECORDING_HINT to FALSE (i.e. simply NULL),
438b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // then Video Mode parameters may remain present in ImageCapture activity as well.
439b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Recording Hint is set to NULL");
440b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_RECORDING_HINT, "");
441ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu            restartPreviewRequired |= resetVideoModeParameters();
44272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            params.getPreviewSize(&mVideoWidth, &mVideoHeight);
443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4459743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) {
4469743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) {
4479743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                CAMHAL_LOGDB("Focus mode set %s", params.get(CameraParameters::KEY_FOCUS_MODE));
4489743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
4499743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                // we need to take a decision on the capture mode based on whether CAF picture or
4509743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                // video is chosen so the behavior of each is consistent to the application
4519743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                if(strcmp(valstr, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0){
4529743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                    restartPreviewRequired |= resetVideoModeParameters();
4539743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                } else if (strcmp(valstr, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) == 0){
4549743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                    restartPreviewRequired |= setVideoModeParameters(params);
4559743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                }
4569743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
4579743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                mParameters.set(CameraParameters::KEY_FOCUS_MODE, valstr);
4589743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu             } else {
4599743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr);
4609743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                ret = -EINVAL;
4619743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu             }
4629743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        }
4639743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
464b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Below parameters can be changed when the preview is running
465f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ( (valstr = params.getPictureFormat()) != NULL ) {
466f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(params.getPictureFormat(),mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) {
467f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.setPictureFormat(valstr);
468f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
469f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr);
470f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
474b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        params.getPictureSize(&w, &h);
475f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ( isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES))) {
476b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.setPictureSize(w, h);
477f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        } else {
478f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            CAMHAL_LOGEB("ERROR: Invalid picture resolution %dx%d", w, h);
479f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            ret = -EINVAL;
480f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
482b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Picture Size by App %d x %d", w, h);
483b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
484f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) {
485f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BURST) >=0) {
486f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Burst set %s", params.get(TICameraParameters::KEY_BURST));
487f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BURST, valstr);
488f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
489f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr);
490f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
492f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
494b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        framerate = params.getPreviewFrameRate();
495524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        valstr = params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
496b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("FRAMERATE %d", framerate);
497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
498524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGVB("Passed FRR: %s, Supported FRR %s", valstr
499524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
500524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGVB("Passed FR: %d, Supported FR %s", framerate
501524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
502524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
503524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
504524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        //Perform parameter validation
505524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if(!isParameterValid(valstr
506524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))
507524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        || !isParameterValid(framerate,
508524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                                      mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES)))
509524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        {
510524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("Invalid frame rate range or frame rate");
511524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            return -EINVAL;
512524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        }
513524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
5141521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // Variable framerate ranges have higher priority over
5151521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // deprecated constant FPS. "KEY_PREVIEW_FPS_RANGE" should
5161521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // be cleared by the client in order for constant FPS to get
5171521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // applied.
518524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( strcmp(valstr, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE))  != 0)
519a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
520524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            // APP wants to set FPS range
521524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            //Set framerate = MAXFPS
522524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGDA("APP IS CHANGING FRAME RATE RANGE");
523b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            params.getPreviewFpsRange(&minFPS, &maxFPS);
524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
525b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( ( 0 > minFPS ) || ( 0 > maxFPS ) )
526a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              {
527f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEA("ERROR: FPS Range is negative!");
528524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                return -EINVAL;
529a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              }
530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
531524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            framerate = maxFPS /CameraHal::VFR_SCALE;
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
533524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          }
534524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        else
535524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          {
536524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman              if ( framerate != atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)) )
537a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              {
538d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman
539524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                selectFPSRange(framerate, &minFPS, &maxFPS);
540d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman                CAMHAL_LOGDB("Select FPS Range %d %d", minFPS, maxFPS);
541a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              }
542524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman              else
543524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                {
544524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    if (videoMode) {
545524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_VIDEO);
546524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        CameraParameters temp;
547524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
548524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
549524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    }
550524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    else {
551524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_IMAGE);
552524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        CameraParameters temp;
553524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
554524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
555524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    }
556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
557524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    framerate = maxFPS / CameraHal::VFR_SCALE;
558524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                }
559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
560524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          }
561a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
562524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("FPS Range = %s", valstr);
563524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("DEFAULT FPS Range = %s", mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
565524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        minFPS /= CameraHal::VFR_SCALE;
566524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        maxFPS /= CameraHal::VFR_SCALE;
567524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
568524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( ( 0 == minFPS ) || ( 0 == maxFPS ) )
569a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
570524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("ERROR: FPS Range is invalid!");
571524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            ret = -EINVAL;
572a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          }
573524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
574524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( maxFPS < minFPS )
575a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
576524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("ERROR: Max FPS is smaller than Min FPS!");
577524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            ret = -EINVAL;
578a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          }
579524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
580524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.setPreviewFrameRate(framerate);
58108bd593a76c52f567ab844a9d92a9ffa2fe47ee9Sundar Raman        mParameters.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE));
582524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
583524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("FPS Range [%d, %d]", minFPS, maxFPS);
584524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.set(TICameraParameters::KEY_MINFRAMERATE, minFPS);
585524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.set(TICameraParameters::KEY_MAXFRAMERATE, maxFPS);
586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
587b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( valstr = params.get(TICameraParameters::KEY_GBCE) ) != NULL )
588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
589b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GBCE Value = %s", valstr);
590b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GBCE, valstr);
591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
593b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( valstr = params.get(TICameraParameters::KEY_GLBCE) ) != NULL )
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
595b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GLBCE Value = %s", valstr);
596b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GLBCE, valstr);
597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
599b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Update the current parameter set
600b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL)
601b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
602b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("AutoConvergence Mode is set = %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE));
603b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr);
6041521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu            }
605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
606b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES)) !=NULL )
607b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
608b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("ManualConvergence Value = %s", params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES));
609b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, valstr);
610b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
612f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_EXPOSURE_MODE)) != NULL) {
613f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES))) {
614f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Exposure set = %s", valstr);
615f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr);
616f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
617f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Exposure  = %s", valstr);
618f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
619b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
620f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
622f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_WHITE_BALANCE)) != NULL) {
623f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu           if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) {
624f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGDB("White balance set %s", valstr);
625f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               mParameters.set(CameraParameters::KEY_WHITE_BALANCE, valstr);
626f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
627f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGEB("ERROR: Invalid white balance  = %s", valstr);
628f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               ret = -EINVAL;
629b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
630f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
632f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) {
633f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) {
634f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Contrast set %s", valstr);
635f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_CONTRAST, valstr);
636f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
637f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Contrast  = %s", valstr);
638f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
639b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
640f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
642f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr =params.get(TICameraParameters::KEY_SHARPNESS)) != NULL) {
643f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SHARPNESS) >= 0 ) {
644f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Sharpness set %s", valstr);
645f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr);
646f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
647f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr);
648f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
649b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
650f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
652f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_SATURATION)) != NULL) {
653f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SATURATION) >= 0 ) {
654f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Saturation set %s", valstr);
655f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SATURATION, valstr);
656f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
657f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr);
658f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
659b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
660f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
662f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BRIGHTNESS)) != NULL) {
663f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BRIGHTNESS) >= 0 ) {
664f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Brightness set %s", valstr);
665f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr);
666f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
667f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr);
668f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
669f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
670f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
671f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu
672f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_ANTIBANDING)) != NULL) {
673f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) {
674f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Antibanding set %s", valstr);
675f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_ANTIBANDING, valstr);
676f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
677f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr);
678f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
679f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
680f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
681f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu
682f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) {
683f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) {
684f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("ISO set %s", valstr);
685f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_ISO, valstr);
686f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
687f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr);
688f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
689b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
690f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
692b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_FOCUS_AREAS)) != NULL )
693b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
69441a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev            CAMHAL_LOGDB("Focus areas position set %s", params.get(CameraParameters::KEY_FOCUS_AREAS));
695b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_FOCUS_AREAS, valstr);
696b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
698b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL )
699b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
700b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Measurements set to %s", params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE));
701b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_MEASUREMENT_ENABLE, valstr);
702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
703b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_ENABLE) == 0)
704b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
705b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = true;
706b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
707b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_DISABLE) == 0)
708b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
709b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
710b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
711b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
712b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
713b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
714b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
716b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
718b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL)
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
720b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Exposure compensation set %s", params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION));
721b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr);
722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
723b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
724f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_SCENE_MODE)) != NULL) {
725f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES))) {
726f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Scene mode set %s", valstr);
727759396a116bb2caf006405777a626fe9a8708114Tyler Luu                doesSetParameterNeedUpdate(valstr,
728759396a116bb2caf006405777a626fe9a8708114Tyler Luu                                           mParameters.get(CameraParameters::KEY_SCENE_MODE),
729759396a116bb2caf006405777a626fe9a8708114Tyler Luu                                           updateRequired);
730f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_SCENE_MODE, valstr);
731f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
732f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr);
733f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
735f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
736b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
737f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_FLASH_MODE)) != NULL) {
738f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES))) {
739f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Flash mode set %s", valstr);
740f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_FLASH_MODE, valstr);
741f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
742f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr);
743f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
745f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
747f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_EFFECT)) != NULL) {
748f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS))) {
749f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Effect set %s", valstr);
750f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_EFFECT, valstr);
751f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
752f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr);
753f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
754f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
755f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
757b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_ROTATION)) != NULL)
758b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_ROTATION) >=0))
759b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
760b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Rotation set %s", params.get(CameraParameters::KEY_ROTATION));
761b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_ROTATION, valstr);
762b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
764b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_QUALITY)) != NULL)
765b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_QUALITY) >=0))
766b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
767b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Jpeg quality set %s", params.get(CameraParameters::KEY_JPEG_QUALITY));
768b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_QUALITY, valstr);
769b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
771b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH)) != NULL)
772b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH) >=0))
773b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
774b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH));
775b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, valstr);
776b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
778b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT)) != NULL)
779b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT) >=0))
780b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
781b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT));
782b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, valstr);
783b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
785b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY)) != NULL )
786b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY) >=0))
787b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
788b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail quality set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY));
789b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, valstr);
790b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
792b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_LATITUDE)) != NULL )
793b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
794b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS latitude set %s", params.get(CameraParameters::KEY_GPS_LATITUDE));
795b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_LATITUDE, valstr);
796b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
797b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_LATITUDE);
798b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
800b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_LONGITUDE)) != NULL )
801b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
802b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS longitude set %s", params.get(CameraParameters::KEY_GPS_LONGITUDE));
803b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_LONGITUDE, valstr);
804b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
805b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_LONGITUDE);
806b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
808b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_ALTITUDE)) != NULL )
809b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
810b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS altitude set %s", params.get(CameraParameters::KEY_GPS_ALTITUDE));
811b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_ALTITUDE, valstr);
812b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
813b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_ALTITUDE);
814b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
816b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_TIMESTAMP)) != NULL )
817b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
818b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS timestamp set %s", params.get(CameraParameters::KEY_GPS_TIMESTAMP));
819b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_TIMESTAMP, valstr);
820b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
821b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_TIMESTAMP);
822b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
824b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL )
825b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
826b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS datestamp set %s", params.get(TICameraParameters::KEY_GPS_DATESTAMP));
827b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr);
828b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
829b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP);
830b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
832b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL )
833b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
834b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS processing method set %s", params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD));
835b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr);
836b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
837b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD);
838b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
840b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL )
841b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
842b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_MAPDATUM));
843b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr);
844b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
845b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM);
846b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
848b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL )
849b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
850b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_VERSION));
851b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr);
852b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
853b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_VERSION);
854b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
856b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL )
857b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
858b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("EXIF Model set %s", params.get(TICameraParameters::KEY_EXIF_MODEL));
859b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr);
860b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
862b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL )
863b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
864b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("EXIF Make set %s", params.get(TICameraParameters::KEY_EXIF_MAKE));
865b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr);
866b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
868b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL )
869b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
870b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE));
871b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valstr);
872b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
873b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else
874b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
875b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
876b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
878f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_ZOOM)) != NULL ) {
879f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((params.getInt(CameraParameters::KEY_ZOOM) >= 0 ) &&
880f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                (params.getInt(CameraParameters::KEY_ZOOM) <= mMaxZoomSupported )) {
881f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Zoom set %s", valstr);
882f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                doesSetParameterNeedUpdate(valstr,
883f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                           mParameters.get(CameraParameters::KEY_ZOOM),
884f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                           updateRequired);
885f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_ZOOM, valstr);
886f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
887f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr);
888f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
889b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
890f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
892b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL )
893b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
894b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Auto Exposure Lock set %s", params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
895f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
896f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       mParameters.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK),
897f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
898b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr);
899b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
901b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL )
902b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
903b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
904f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
905f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       mParameters.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK),
906f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
907b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr);
908b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
909708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        if( (valstr = params.get(CameraParameters::KEY_METERING_AREAS)) != NULL )
910708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            {
91141a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev            CAMHAL_LOGDB("Metering areas position set %s", params.get(CameraParameters::KEY_METERING_AREAS));
912708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            mParameters.set(CameraParameters::KEY_METERING_AREAS, valstr);
913708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            }
914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
915b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CameraParameters adapterParams = mParameters;
916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
917b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        // Only send parameters to adapter if preview is already
918f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter,
919f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // will be called in startPreview()
920f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // TODO(XXX): Need to identify other parameters that need update from camera adapter
921f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        if ( (NULL != mCameraAdapter) && (mPreviewEnabled || updateRequired) ) {
922b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ret |= mCameraAdapter->setParameters(adapterParams);
923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
925b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) )
926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
927b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS);
928b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( 0 < posBracketRange )
929b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
930b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketRangePositive = posBracketRange;
931b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
933b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Positive bracketing range %d", mBracketRangePositive);
934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
936b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG) )
937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
938b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            int negBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG);
939b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( 0 < negBracketRange )
940b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
941b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketRangeNegative = negBracketRange;
942b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
944b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Negative bracketing range %d", mBracketRangeNegative);
945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
946b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL) &&
947b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::BRACKET_ENABLE) == 0 ))
948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
949b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( !mBracketingEnabled )
950b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
951b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Enabling bracketing");
952b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketingEnabled = true;
953b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
954b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                //Wait for AF events to enable bracketing
955b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                if ( NULL != mCameraAdapter )
956b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    {
957b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    setEventProvider( CameraHalEvent::ALL_EVENTS, mCameraAdapter );
958b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    }
959b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
960b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
962b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Bracketing already enabled");
963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
965b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else if ( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL ) &&
966b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::BRACKET_DISABLE) == 0 ))
967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
968b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling bracketing");
969b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
970b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mBracketingEnabled = false;
971b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            stopImageBracketing();
972b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
973b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            //Remove AF events subscription
974b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( NULL != mEventProvider )
975b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
976b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mEventProvider->disableEventNotification( CameraHalEvent::ALL_EVENTS );
977b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                delete mEventProvider;
978b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mEventProvider = NULL;
979b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
980b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
983b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
984b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::SHUTTER_ENABLE) == 0 ))
985b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
986b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Enabling shutter sound");
987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
988b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = true;
989b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled |= CAMERA_MSG_SHUTTER;
990b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
991b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
992b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else if ( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
993b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::SHUTTER_DISABLE) == 0 ))
994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
995b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling shutter sound");
996b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
997b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = false;
998b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled &= ~CAMERA_MSG_SHUTTER;
999b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1002b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
1003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1004b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    //On fail restore old parameters
1005b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    if ( NO_ERROR != ret ) {
1006b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman        mParameters.unflatten(oldParams.flatten());
1007b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    }
1008b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman
1009b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running.
1010b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // If preview is not started yet, Video Mode parameters will take effect on next startPreview()
10113dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng    if (restartPreviewRequired && previewEnabled() && !mRecordingEnabled) {
1012ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        CAMHAL_LOGDA("Restarting Preview");
1013b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ret = restartPreview();
10143dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng    } else if (restartPreviewRequired && !previewEnabled() &&
10153dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                mDisplayPaused && !mRecordingEnabled) {
1016ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        CAMHAL_LOGDA("Stopping Preview");
1017ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        forceStopPreview();
1018ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu    }
1019ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu
1020b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if (ret != NO_ERROR)
1021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1022b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGEA("Failed to restart Preview");
1023b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        return ret;
1024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1029b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        unsigned int buffercount, unsigned int &max_queueable)
1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() == NULL)
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Memory allocation of preview buffers is now placed in gralloc
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // CameraHal should not allocate preview buffers without DisplayAdapter
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mPreviewBufs)
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///@todo Pluralise the name of this method to allocateBuffers
1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewLength = 0;
1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewBufs = (int32_t *) mDisplayAdapter->allocateBuffer(width, height,
1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    previewFormat,
1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    mPreviewLength,
1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    buffercount);
1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (NULL == mPreviewBufs ) {
1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview buffers");
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_MEMORY;
1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets();
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == mPreviewOffsets ) {
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Buffer mapping failed");
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return BAD_VALUE;
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewFd = mDisplayAdapter->getFd();
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( -1 == mPreviewFd ) {
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Invalid handle");
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return BAD_VALUE;
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          }
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBufProvider = (BufferProvider*) mDisplayAdapter.get();
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->maxQueueableBuffers(max_queueable);
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (ret != NO_ERROR) {
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewBufs()
1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("mPreviewBufs = 0x%x", (unsigned int)mPreviewBufs);
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mPreviewBufs)
1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///@todo Pluralise the name of this method to freeBuffers
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mBufProvider->freeBuffer(mPreviewBufs);
1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewBufs = NULL;
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount)
1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int bytes;
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bytes = size;
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mPreviewDataBufs )
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = freePreviewDataBufs();
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1124c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman        bytes = ((bytes+4095)/4096)*4096;
1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, NULL, bytes, bufferCount);
1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes);
1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL == mPreviewDataBufs )
1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -NO_MEMORY;
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes = size;
1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = mMemoryManager->getFd();
1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = bytes;
1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = mMemoryManager->getOffsets();
1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = -1;
1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = 0;
1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = NULL;
1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewDataBufs()
1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mPreviewDataBufs )
1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@todo Pluralise the name of this method to freeBuffers
1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mMemoryManager->freeBuffer(mPreviewDataBufs);
1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mPreviewDataBufs = NULL;
1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size, const char* previewFormat, unsigned int bufferCount)
1182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int bytes;
1185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bytes = size;
1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1190fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    // allocate image buffers only if not already allocated
1191fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if(NULL != mImageBufs) {
1192fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        return NO_ERROR;
1193fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1197c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman        bytes = ((bytes+4095)/4096)*4096;
1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, previewFormat, bytes, bufferCount);
1199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes);
1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL == mImageBufs )
1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -NO_MEMORY;
1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes = size;
1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = mMemoryManager->getFd();
1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = bytes;
1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = mMemoryManager->getOffsets();
1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = -1;
1221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = 0;
1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = NULL;
1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
123072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengstatus_t CameraHal::allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount)
123172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
123272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  status_t ret = NO_ERROR;
123372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
123472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
123572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if( NULL != mVideoBufs ){
123672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    ret = freeVideoBufs(mVideoBufs);
123772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoBufs = NULL;
123872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
123972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
124072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( NO_ERROR == ret ){
124172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    int32_t stride;
124272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    buffer_handle_t *bufsArr = new buffer_handle_t [bufferCount];
124372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
124472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if (bufsArr != NULL){
124572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      for (int i = 0; i< bufferCount; i++){
124672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        GraphicBufferAllocator &GrallocAlloc = GraphicBufferAllocator::get();
124772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        buffer_handle_t buf;
124872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        ret = GrallocAlloc.alloc(width, height, HAL_PIXEL_FORMAT_NV12, CAMHAL_GRALLOC_USAGE, &buf, &stride);
124972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if (ret != NO_ERROR){
125072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          CAMHAL_LOGEA("Couldn't allocate video buffers using Gralloc");
125172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          ret = -NO_MEMORY;
125272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          for (int j=0; j< i; j++){
125372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            buf = (buffer_handle_t)bufsArr[j];
125472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            CAMHAL_LOGEB("Freeing Gralloc Buffer 0x%x", buf);
125572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            GrallocAlloc.free(buf);
125672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
125772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          delete [] bufsArr;
125872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          goto exit;
125972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        }
126072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        bufsArr[i] = buf;
126172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGVB("*** Gralloc Handle =0x%x ***", buf);
126272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
126372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
126472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      mVideoBufs = (int32_t *)bufsArr;
126572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
126672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    else{
126772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      CAMHAL_LOGEA("Couldn't allocate video buffers ");
126872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      ret = -NO_MEMORY;
126972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
127072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
127172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
127272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng exit:
127372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
127472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
127572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  return ret;
127672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
127772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
1278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid endImageCapture( void *userData)
1279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != userData )
1283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->signalEndImageCapture();
1286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid releaseImageBuffers(void *userData)
1292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1295fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if (NULL != userData) {
1296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->freeImageBufs();
1298fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
1299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::signalEndImageCapture()
1304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w,h;
1307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters adapterParams = mParameters;
1308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
1309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
131288006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    if ( mBracketingRunning ) {
131388006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        stopImageBracketing();
131488006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    } else {
131588006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
131688006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    }
1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freeImageBufs()
1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mImageBufs )
1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@todo Pluralise the name of this method to freeBuffers
1336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mMemoryManager->freeBuffer(mImageBufs);
1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mImageBufs = NULL;
1338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
135272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengstatus_t CameraHal::freeVideoBufs(void *bufs)
135372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
135472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  status_t ret = NO_ERROR;
1355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
135672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
135772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
135872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  buffer_handle_t *pBuf = (buffer_handle_t*)bufs;
135972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
136072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if(pBuf == NULL)
136172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    {
136272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      CAMHAL_LOGEA("NULL pointer passed to freeVideoBuffer");
136372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      LOG_FUNCTION_NAME_EXIT;
136472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      return BAD_VALUE;
136572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
136672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
136772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  GraphicBufferAllocator &GrallocAlloc = GraphicBufferAllocator::get();
136872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
136972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  for(int i = 0; i < count; i++){
137072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    buffer_handle_t ptr = *pBuf++;
137172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    CAMHAL_LOGVB("Free Video Gralloc Handle 0x%x", ptr);
137272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    GrallocAlloc.free(ptr);
137372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
137472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
137572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
137672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
137772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  return ret;
137872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start preview mode.
1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Camera switched to VF mode
1385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update function header with the different errors that are possible
1386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startPreview()
1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
1393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
1394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
1395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int required_buffer_count;
1396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int max_queueble_buffers;
1397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartPreview, NULL);
1400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
14047016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if ( mPreviewEnabled ){
14057016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      CAMHAL_LOGDA("Preview already running");
14067016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      LOG_FUNCTION_NAME_EXIT;
14077016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      return ALREADY_EXISTS;
1408e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1409e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1410e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    if ( NULL != mCameraAdapter ) {
14117016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->setParameters(mParameters);
14127016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    }
14137016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng
14147016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if ((mPreviewStartInProgress == false) && (mDisplayPaused == false)){
14157016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW,( int ) &frame);
14167016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      if ( NO_ERROR != ret ){
14177016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        CAMHAL_LOGEB("Error: CAMERA_QUERY_RESOLUTION_PREVIEW %d", ret);
14187016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        return ret;
14197016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      }
14207016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng
14217016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ///Update the current preview width and height
14227016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewWidth = frame.mWidth;
14237016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewHeight = frame.mHeight;
14247016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      //Update the padded width and height - required for VNF and VSTAB
14257016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mParameters.set(TICameraParameters::KEY_PADDED_WIDTH, mPreviewWidth);
14267016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mParameters.set(TICameraParameters::KEY_PADDED_HEIGHT, mPreviewHeight);
1427e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1428e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1429e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1430e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    ///If we don't have the preview callback enabled and display adapter,
14317016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL)){
143241a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev      CAMHAL_LOGDA("Preview not started. Preview in progress flag set");
14337016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewStartInProgress = true;
14347016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SWITCH_TO_EXECUTING);
14357016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      if ( NO_ERROR != ret ){
14367016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        CAMHAL_LOGEB("Error: CAMERA_SWITCH_TO_EXECUTING %d", ret);
14377016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        return ret;
14387016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      }
14397016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      return NO_ERROR;
1440e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1441e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) )
1443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Preview is in paused state");
1445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayPaused = false;
1447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewEnabled = true;
1448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
1453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("Display adapter resume failed %x", ret);
1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //restart preview callbacks
1458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME);
1461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1462ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        return ret;
1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Allocate the preview buffers
14697016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    ret = allocPreviewBufs(mPreviewWidth, mPreviewHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
1470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR != ret )
1472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't allocate buffers for Preview");
1474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mMeasurementEnabled )
1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA,
1481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          ( int ) &frame,
1482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          required_buffer_count);
1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ///Allocate the preview data buffers
1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = allocPreviewDataBufs(frame.mLength, required_buffer_count);
1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret ) {
1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview data buffers");
1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto error;
1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev           }
1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mPreviewDataBufs;
1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mPreviewDataOffsets;
1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mPreviewDataFd;
1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mPreviewDataLength;
1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) required_buffer_count;
1502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = (size_t) required_buffer_count;
1503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA,
1505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        ( int ) &desc);
1506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Pass the buffers to Camera Adapter
1511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mBuffers = mPreviewBufs;
1512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mOffsets = mPreviewOffsets;
1513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mFd = mPreviewFd;
1514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mLength = mPreviewLength;
1515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mCount = ( size_t ) required_buffer_count;
1516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mMaxQueueable = (size_t) max_queueble_buffers;
1517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
15188fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW,
15198fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman                                      ( int ) &desc);
15208fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman
15218fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    if ( NO_ERROR != ret )
15228fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        {
15238fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret);
15248fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        freePreviewBufs();
15258fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        return ret;
15268fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        }
1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count);
1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
1531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mAppCallbackNotifier->start();
1532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( ALREADY_EXISTS == ret )
1534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Already running, do nothing
1536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("AppCallbackNotifier already running");
1537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_ERROR;
1538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( NO_ERROR == ret ) {
1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Started AppCallbackNotifier..");
1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Couldn't start AppCallbackNotifier");
1546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Enable the display adapter if present, actual overlay enable happens when we post the buffer
1550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() != NULL)
1551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Enabling display");
1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        bool isS3d = false;
1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        DisplayAdapter::S3DParameters s3dParams;
1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int width, height;
1556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mParameters.getPreviewSize(&width, &height);
1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if 0 //TODO: s3d is not part of bringup...will reenable
1558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_SUPPORTED)) != NULL) {
1559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            isS3d = (strcmp(valstr, "true") == 0);
1560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL) {
1562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (strcmp(valstr, "off") == 0)
1563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS OFF");
1565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //TODO: obtain the frame packing configuration from camera or user settings
1566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //once side by side configuration is supported
1567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.mode = OVERLAY_S3D_MODE_ON;
1568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS ON");
1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.mode = OVERLAY_S3D_MODE_OFF;
1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif //if 0
1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview, isS3d ? &s3dParams : NULL);
1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
1588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->enableDisplay(width, height, NULL, isS3d ? &s3dParams : NULL);
1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( ret != NO_ERROR )
1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't enable display");
1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto error;
1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Send START_PREVIEW command to adapter
1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Starting CameraAdapter preview mode");
1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW);
1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(ret!=NO_ERROR)
1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter");
1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Started preview");
1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = true;
1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStartInProgress = false;
1615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    error:
1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Performing cleanup after error");
1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Do all the cleanup
1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        freePreviewBufs();
1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayAdapter.get() != NULL)
1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
16266b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng            mDisplayAdapter->disableDisplay(false);
1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stop();
1629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewStartInProgress = false;
1630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewEnabled = false;
1631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Sets ANativeWindow object.
1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it
1640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   to render buffers to display.
1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] window The ANativeWindow object created by Surface flinger
1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the ANativeWindow object passes validation criteria
1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::setPreviewWindow(struct preview_stream_ops *window)
1648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
1651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = true;
1654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter
1656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!window)
1657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayAdapter.get() != NULL)
1659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///NULL window passed, destroy the display adapter if present
166141a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev            CAMHAL_LOGDA("NULL window passed, destroying display adapter");
1662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mDisplayAdapter.clear();
1663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client
1664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@remarks so, we will wait until it passes a valid window to begin the preview again
1665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSetPreviewWindowCalled = false;
1666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
166741a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev        CAMHAL_LOGDA("NULL ANativeWindow passed to setPreviewWindow");
1668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
1669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }else if(mDisplayAdapter.get() == NULL)
1670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Need to create the display adapter since it has not been created
1672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Create display adapter
1673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter = new ANativeWindowDisplayAdapter();
1674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_ERROR;
1675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR))
1676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if(ret!=NO_ERROR)
1678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mDisplayAdapter.clear();
1680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("DisplayAdapter initialize failed");
1681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                LOG_FUNCTION_NAME_EXIT;
1682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return ret;
1683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
1685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("Couldn't create DisplayAdapter");
1687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                LOG_FUNCTION_NAME_EXIT;
1688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return NO_MEMORY;
1689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // DisplayAdapter needs to know where to get the CameraFrames from inorder to display
1693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter
1694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->setFrameProvider(mCameraAdapter);
1695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Any dynamic errors that happen during the camera use case has to be propagated back to the application
1697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
1698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Set it as the error handler for the DisplayAdapter
1699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get());
1700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Update the display adapter with the new window that is passed from CameraService
1702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret  = mDisplayAdapter->setPreviewWindow(window);
1703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(ret!=NO_ERROR)
1704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
1706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mPreviewStartInProgress)
1709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("setPreviewWindow called when preview running");
1711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            // Start the preview since the window is now available
1712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = startPreview();
1713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
171439371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu    } else {
171539371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu        // Update the display adapter with the new window that is passed from CameraService
171639371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu        ret = mDisplayAdapter->setPreviewWindow(window);
171739371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu        if ( (NO_ERROR == ret) && previewEnabled() ) {
171839371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu            restartPreview();
171939371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu        } else if (ret == ALREADY_EXISTS) {
172039371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu            // ALREADY_EXISTS should be treated as a noop in this case
172139371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu            ret = NO_ERROR;
172239371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu        }
1723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
1733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
1736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopPreview()
1739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1742150f3c891ce774b1546e90fab640ccb9c29ce536Akwasi Boateng    if( (!previewEnabled() && !mDisplayPaused) || mRecordingEnabled)
1743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
1746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17480e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman    bool imageCaptureRunning = (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE) &&
17490e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman                                    (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE);
17500e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman    if(mDisplayPaused && !imageCaptureRunning)
1751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Display is paused, which essentially means there is no preview active.
1753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Note: this is done so that when stopPreview is called by client after
1754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // an image capture, we do not de-initialize the camera adapter and
1755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // restart over again.
175697db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu
1757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
1758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    forceStopPreview();
1761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1762b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Reset Capture-Mode to default, so that when we switch from VideoRecording
1763b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE.
1764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Resetting Capture-Mode to default");
1765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
1766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if preview is enabled
1772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If preview is running currently
1775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If preview has been stopped
1776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::previewEnabled()
1779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return (mPreviewEnabled || mPreviewStartInProgress);
1783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start record mode.
1787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with
1789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  the corresponding frame. Every record frame must be released by calling
1790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  releaseRecordingFrame().
1791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If recording could be started without any issues
1794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update the header with possible error values in failure scenarios
1795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startRecording( )
1798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
1800b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
1801b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
1802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            gettimeofday(&mStartPreview, NULL);
1810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled())
1814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
18189743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // set internal recording hint in case camera adapter needs to make some
18199743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // decisions....(will only be sent to camera adapter if camera restart is required)
18209743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    mParameters.set(TICameraParameters::KEY_RECORDING_HINT, CameraParameters::TRUE);
18219743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
18229743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // if application starts recording in continuous focus picture mode...
18239743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // then we need to force default capture mode (as opposed to video mode)
18249743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    if ( ((valstr = mParameters.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) &&
18259743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu         (strcmp(valstr, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0) ){
18269743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        restartPreviewRequired = resetVideoModeParameters();
18279743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
18289743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
18299743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // only need to check recording hint if preview restart is not already needed
1830b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
18319743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    if ( !restartPreviewRequired &&
18329743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu         (!valstr || (valstr && (strcmp(valstr, CameraParameters::TRUE) != 0))) ) {
18338b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        restartPreviewRequired = setVideoModeParameters(mParameters);
18349743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
1835b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
18369743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    if (restartPreviewRequired) {
18379743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        ret = restartPreview();
18389743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
1839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
184172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      {
184272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
184372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        mParameters.getPreviewSize(&w, &h);
184472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGDB("%s Video Width=%d Height=%d", __FUNCTION__, mVideoWidth, mVideoHeight);
184572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
184672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if ((w != mVideoWidth) && (h != mVideoHeight))
184772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
184872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = allocVideoBufs(mVideoWidth, mVideoHeight, count);
184972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            if ( NO_ERROR != ret )
185072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              {
185172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
18529743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
185372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                return ret;
185472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              }
185572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
185672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->useVideoBuffers(true);
185772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->setVideoRes(mVideoWidth, mVideoHeight);
185872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, count, mVideoBufs);
185972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
186072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        else
186172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
186272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->useVideoBuffers(false);
186372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->setVideoRes(mPreviewWidth, mPreviewHeight);
186472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, count, NULL);
186572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
186672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
1867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret = mAppCallbackNotifier->startRecording();
1871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter
1876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret =  mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO);
1877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecordingEnabled = true;
1882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters specific to Video Recording.
1891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function checks for the camera parameters which have to be set for recording.
1893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it.
1894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function also enables Video Recording specific functions like VSTAB & VNF.
1895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1897b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Modify the policies for enabling VSTAB & VNF usecase based later.
1899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
19018b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luubool CameraHal::setVideoModeParameters(const CameraParameters& params)
1902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
1904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool restartPreviewRequired = false;
1905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (valstr == NULL) ||
1912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) ) )
1913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE");
1915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE);
1916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        restartPreviewRequired = true;
1917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1919cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    // Check if CAPTURE_MODE is VIDEO_MODE, since VSTAB & VNF work only in VIDEO_MODE.
1920cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
19218b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    if (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0) {
19228b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu       // set VSTAB. restart is required if vstab value has changed
19238b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu       if (params.get(CameraParameters::KEY_VIDEO_STABILIZATION) != NULL) {
19248b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            // make sure we support vstab
19258b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
19268b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                       CameraParameters::TRUE) == 0) {
19278b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                valstr = mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION);
19288b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                // vstab value has changed
19298b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                if ((valstr != NULL) &&
19308b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                     strcmp(valstr, params.get(CameraParameters::KEY_VIDEO_STABILIZATION)) != 0) {
19318b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                    restartPreviewRequired = true;
19328b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                }
19338b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION,
19348b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                                params.get(CameraParameters::KEY_VIDEO_STABILIZATION));
1935cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            }
19368b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        } else if (mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION)) {
19378b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            // vstab was configured but now unset
19388b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            restartPreviewRequired = true;
19398b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            mParameters.remove(CameraParameters::KEY_VIDEO_STABILIZATION);
19408b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        }
1941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19428b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        // Set VNF
19438b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        if (params.get(TICameraParameters::KEY_VNF) == NULL) {
1944cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Enable VNF");
1945cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VNF, "1");
1946cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
19478b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        } else {
19488b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            valstr = mParameters.get(TICameraParameters::KEY_VNF);
19498b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            if (valstr && strcmp(valstr, params.get(TICameraParameters::KEY_VNF)) != 0) {
19508b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                restartPreviewRequired = true;
1951cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            }
19528b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            mParameters.set(TICameraParameters::KEY_VNF, params.get(TICameraParameters::KEY_VNF));
19538b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        }
1954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1955cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU.
1956cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048.
1957cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution.
19588b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        valstr = mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION);
19598b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        if (valstr && (strcmp(valstr, CameraParameters::TRUE) == 0) && (mPreviewWidth == 1920)) {
1960cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Force Enable VNF for 1080p");
1961cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VNF, "1");
1962cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
1963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
19648b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    }
1965b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
1966b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1967b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
1968b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
1969b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1970b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
1971b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Reset the camera parameters specific to Video Recording.
1972b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1973b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF.
1974b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1975b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
1976b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1977b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1978b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
1979b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilbool CameraHal::resetVideoModeParameters()
1980b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
1981b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
1982b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
1983b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
1984b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1985b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
1986b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1987d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    // ignore this if we are already recording
1988d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    if (mRecordingEnabled) {
1989d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu        return false;
1990d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    }
1991d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu
1992b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1993b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
19948b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    if ((valstr != NULL) && (strcmp(valstr, TICameraParameters::VIDEO_MODE) == 0)) {
1995b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Reset Capture-Mode to default");
1996b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
1997b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = true;
19988b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    }
1999b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2000b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
2001b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2002b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
2003b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
2004b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2005b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
2006b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Restart the preview with setParameter.
2007b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2008b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function restarts preview, for some VIDEO_MODE parameters to take effect.
2009b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2010b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
2011b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return NO_ERROR If recording parameters could be set without any issues
2012b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2013b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
2014b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilstatus_t CameraHal::restartPreview()
2015b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
2016b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
2017b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    char tmpvalstr[30];
2018b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
2019b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2020b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
2021b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2022b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview().
2023b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    tmpvalstr[0] = 0;
2024b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2025b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if(valstr != NULL)
2026b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        {
2027b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(sizeof(tmpvalstr) < (strlen(valstr)+1))
2028b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
2029b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            return -EINVAL;
2030b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
2031b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2032e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman        strncpy(tmpvalstr, valstr, sizeof(tmpvalstr));
2033b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        tmpvalstr[sizeof(tmpvalstr)-1] = 0;
2034b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        }
2035b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2036ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu    forceStopPreview();
2037b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2038b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    {
2039b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        Mutex::Autolock lock(mLock);
2040b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_CAP_MODE, tmpvalstr);
2041b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mCameraAdapter->setParameters(mParameters);
2042b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
2043b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2044b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    ret = startPreview();
2045b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started recording.
2053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopRecording()
2059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
20607d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    CameraAdapter::AdapterState currentState;
20617d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
20647d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    Mutex::Autolock lock(mLock);
20657d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!mRecordingEnabled )
2067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
2069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
20717d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    currentState = mCameraAdapter->getState();
20727d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) {
20737d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
20747d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    }
20757d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->stopRecording();
2077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO);
2079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
2081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
208272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if ( mAppCallbackNotifier->getUesVideoBuffers() ){
208372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      freeVideoBufs(mVideoBufs);
208472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      if (mVideoBufs){
208572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGVB(" FREEING mVideoBufs 0x%x", mVideoBufs);
208672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        delete [] mVideoBufs;
208772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
208872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      mVideoBufs = NULL;
208972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
209072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
20919743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // reset internal recording hint in case camera adapter needs to make some
20929743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // decisions....(will only be sent to camera adapter if camera restart is required)
20939743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
20949743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
2095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if recording is enabled.
2100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If recording is currently running
2103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If recording has been stopped
2104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::recordingEnabled()
2107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mRecordingEnabled;
2113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
2117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers
2119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               previously given by CameraHal
2120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::releaseRecordingFrame(const void* mem)
2124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //CAMHAL_LOGDB(" 0x%x", mem->pointer());
2128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( mRecordingEnabled ) && mem != NULL)
2130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->releaseRecordingFrame(mem);
2132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return;
2137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start auto focus
2141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This call asynchronous.
2143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   The notification callback routine is called with CAMERA_MSG_FOCUS once when
2144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focusing is complete. autoFocus() will be called again if another auto focus is
2145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   needed.
2146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
2149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes if the focus is not locked
2150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::autoFocus()
2153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&mStartFocus, NULL);
2159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
21642ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    Mutex::Autolock lock(mLock);
216578dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev
21662ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    mMsgEnabled |= CAMERA_MSG_FOCUS;
21672ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
216878dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    if ( NULL == mCameraAdapter )
216978dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        {
217078dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            ret = -1;
217178dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            goto EXIT;
217278dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        }
217378dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev
217478dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    CameraAdapter::AdapterState state;
217578dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    ret = mCameraAdapter->getState(state);
217678dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    if (ret != NO_ERROR)
217778dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        {
217878dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            goto EXIT;
217978dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        }
21802ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
218178dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    if (state == CameraAdapter::AF_STATE)
2182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2183e46394481e771dbdc8683645c3740a3d262a3d0fIliyan Malchev            CAMHAL_LOGI("Ignoring start-AF (already in progress)");
218478dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            goto EXIT;
218578dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        }
2186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //pass the autoFocus timestamp along with the command to camera adapter
2190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus);
2191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS);
2195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
219878dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan MalchevEXIT:
2199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancels auto-focus function.
2206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   If the auto-focus is still in progress, this function will cancel it.
2208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Whether the auto-focus is in progress or not, this function will return the
2209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focus position to the default. If the camera does not support auto-focus, this is a no-op.
2210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the cancel succeeded
2214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if cancel didnt succeed
2215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelAutoFocus()
2218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
22202ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
22212ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    Mutex::Autolock lock(mLock);
2222fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    CameraParameters adapterParams = mParameters;
22232ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    mMsgEnabled &= ~CAMERA_MSG_FOCUS;
22242ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
2225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
2226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2227fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        adapterParams.set(TICameraParameters::KEY_AUTO_FOCUS_LOCK, CameraParameters::FALSE);
2228fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        mCameraAdapter->setParameters(adapterParams);
2229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
22303ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman        mAppCallbackNotifier->flushEventQueue();
2231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2232fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu
2233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier)
2238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
2243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
2246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
2247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay);
2250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == mEventProvider )
2251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error in creating EventProvider");
2253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->enableEventNotification(eventMask);
2257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallbackRelay(CameraHalEvent* event)
2263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHal *appcbn = ( CameraHal * ) (event->mCookie);
2267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    appcbn->eventCallback(event );
2268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallback(CameraHalEvent* event)
2273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != event )
2277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch( event->mEventType )
2279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CameraHalEvent::EVENT_FOCUS_LOCKED:
2281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CameraHalEvent::EVENT_FOCUS_ERROR:
2282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( mBracketingEnabled )
2284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
2285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    startImageBracketing();
2286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
2287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
2290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
2294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startImageBracketing()
2300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        status_t ret = NO_ERROR;
2302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraFrame frame;
2303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraAdapter::BuffersDescriptor desc;
2304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartCapture, NULL);
2308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
2312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!previewEnabled() && !mDisplayPaused)
2314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            LOG_FUNCTION_NAME_EXIT;
2316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
2317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( !mBracketingEnabled )
2320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
2322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingRunning = true;
2327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &frame,
2333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( mBracketRangeNegative + 1 ));
2334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != mAppCallbackNotifier.get() )
2344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
2346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mParameters.getPictureSize(( int * ) &frame.mWidth,
2352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                       ( int * ) &frame.mHeight);
2353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = allocImageBufs(frame.mWidth,
2355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mHeight,
2356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mLength,
2357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mParameters.getPictureFormat(),
2358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 ( mBracketRangeNegative + 1 ));
2359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
236072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              {
2361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
236272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              }
2363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mImageBufs;
2369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
2370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
2371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
2372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 );
2373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = ( size_t ) ( mBracketRangeNegative + 1 );
2374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
2377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
2379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 //pass capture timestamp along with the camera adapter command
2384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE,  ( mBracketRangePositive + 1 ),  (int) &mStartCapture);
2385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ));
2389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
2396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::stopImageBracketing()
2399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        status_t ret = NO_ERROR;
2401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
2403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
240488006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        if( !previewEnabled() )
2405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
2407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
240988006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        mBracketingRunning = false;
241088006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman
241188006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE);
2412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
2416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Take a picture.
2420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If able to switch to image capture
2423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if unable to switch to image capture
2424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::takePicture( )
2427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
2430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
2431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int burst;
2432ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    const char *valstr = NULL;
2433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int bufferCount = 1;
2434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&mStartCapture, NULL);
2440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled() && !mDisplayPaused)
2446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2448ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Preview not started...");
2449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
2450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2452ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // return error if we are already capturing
2453ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE &&
2454ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu          mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) ||
2455ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE &&
2456ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu          mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE) ) {
2457ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Already capturing an image...");
2458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
2459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2461ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // we only support video snapshot if we are in video mode (recording hint is set)
2462ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2463ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) &&
2464ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (valstr && strcmp(valstr, TICameraParameters::VIDEO_MODE)) ) {
2465ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Trying to capture while recording without recording hint set...");
2466ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        return INVALID_OPERATION;
2467ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
2468ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( !mBracketingRunning )
2470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if ( NO_ERROR == ret )
2473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            burst = mParameters.getInt(TICameraParameters::KEY_BURST);
2475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //Allocate all buffers only in burst capture case
2478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if ( burst > 1 )
2479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
2480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             bufferCount = CameraHal::NO_BUFFERS_IMAGE_CAPTURE;
2481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( NULL != mAppCallbackNotifier.get() )
2482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
2484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
2486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         else
2487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
2488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( NULL != mAppCallbackNotifier.get() )
2489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(false);
2491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
2493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2494ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // pause preview during normal image capture
2495ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // do not pause preview if recording (video state)
2496ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if (NO_ERROR == ret &&
2497ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                NULL != mDisplayAdapter.get() &&
2498ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                burst < 1) {
2499ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) {
2500ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mDisplayPaused = true;
2501ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mPreviewEnabled = false;
2502ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
2503ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                // since preview is paused we should stop sending preview frames too
2504ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
2505ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME);
2506ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                }
2507ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            }
2508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mDisplayAdapter->setSnapshotTimeRef(&mStartCapture);
2511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2512ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        }
2513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2514c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        // if we taking video snapshot...
2515c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        if ((NO_ERROR == ret) && (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE)) {
2516c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            // enable post view frames if not already enabled so we can internally
2517c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            // save snapshot frames for generating thumbnail
2518c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            if((mMsgEnabled & CAMERA_MSG_POSTVIEW_FRAME) == 0) {
2519c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu                mAppCallbackNotifier->enableMsgType(CAMERA_MSG_POSTVIEW_FRAME);
2520c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            }
2521c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        }
2522c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu
2523ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) )
2524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
2526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  ( int ) &frame,
2528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  bufferCount);
2529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mParameters.getPictureSize(( int * ) &frame.mWidth,
2539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                       ( int * ) &frame.mHeight);
2540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = allocImageBufs(frame.mWidth,
2542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mHeight,
2543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mLength,
2544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mParameters.getPictureFormat(),
2545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 bufferCount);
2546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
2549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mImageBufs;
2555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
2556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
2557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
2558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) bufferCount;
2559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = ( size_t ) bufferCount;
2560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
2563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( NULL != mCameraAdapter ) )
2567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //pass capture timestamp along with the camera adapter command
2572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,  (int) &mStartCapture);
2573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
2577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancel a picture that was started with takePicture.
2587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Calling this method when no picture is being taken is a no-op.
2589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent
2592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
2593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelPicture( )
2596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
2602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Return the camera parameters.
2608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return Currently configured camera parameters
2611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar* CameraHal::getParameters()
2614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    String8 params_str8;
2616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char* params_string;
261772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    const char * valstr = NULL;
2618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
2622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2623f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        mCameraAdapter->getParameters(mParameters);
2624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
262672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    CameraParameters mParams = mParameters;
262772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
262872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
262972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
263072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if(valstr != NULL)
263172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      {
263272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if(strcmp(valstr, CameraParameters::TRUE) == 0)
263372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
263472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            //HACK FOR MMS MODE
263572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            resetPreviewRes(&mParams, mVideoWidth, mVideoHeight);
263672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
263772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
2638524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
26399743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // do not send internal parameters to upper layers
26409743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    mParams.remove(TICameraParameters::KEY_RECORDING_HINT);
2641fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    mParams.remove(TICameraParameters::KEY_AUTO_FOCUS_LOCK);
26429743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
264372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    params_str8 = mParams.flatten();
2644524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
2645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // camera service frees this string...
2646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params_string = (char*) malloc(sizeof(char) * (params_str8.length()+1));
2647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    strcpy(params_string, params_str8.string());
2648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Return the current set of parameters
2652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return params_string;
2654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::putParameters(char *parms)
2657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    free(parms);
2659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Send command to camera driver.
2663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the command succeeds
2666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes that this function can return
2667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
2670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) )
2677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("No CameraAdapter instance");
2679057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        return -EINVAL;
2680057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        }
2681057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu
2682057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
2683057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    // Following commands do NOT need preview to be started
2684057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
2685057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    switch(cmd) {
2686057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
2687057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            bool enable = static_cast<bool>(arg1);
2688057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            Mutex::Autolock lock(mLock);
2689057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            if (enable) {
2690057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu                mMsgEnabled |= CAMERA_MSG_FOCUS_MOVE;
2691057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            } else {
2692057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu                mMsgEnabled &= ~CAMERA_MSG_FOCUS_MOVE;
2693057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            }
2694057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            return NO_ERROR;
2695057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        break;
2696057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    }
2697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( !previewEnabled() ))
2699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Preview is not running");
2701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
2702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2704057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
2705057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    // Following commands NEED preview to be started
2706057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
2707057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu
2708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
2709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch(cmd)
2711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_SMOOTH_ZOOM:
2713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1);
2715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_SMOOTH_ZOOM:
2718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM);
2720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_FACE_DETECTION:
2722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD);
2724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_FACE_DETECTION:
2728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
2730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
2734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
2736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release the hardware resources owned by this object.
2745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Note that this is *not* done in the destructor.
2747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::release()
2753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@todo Investigate on how release is used by CameraService. Vaguely remember that this is called
2756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///just before CameraHal object destruction
2757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
2758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Dump state of the camera hardware
2764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] fd    File descriptor
2766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] args  Arguments
2767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Dump succeeded
2768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo  Error codes for dump fail
2769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t  CameraHal::dump(int fd) const
2772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Implement this method when the h/w dump function is supported on Ducati side
2775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Interface Method definitions ENDS here--------------------*/
2779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Internal Method definitions STARTS here--------------------*/
2784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Constructor of CameraHal
2787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Member variables are initialized here.  No allocations should be done here as we
2789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   don't use c++ exceptions in the code.
2790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::CameraHal(int cameraId)
2793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize all the member variables to their defaults
2797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
2798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewBufs = NULL;
2799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageBufs = NULL;
2800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBufProvider = NULL;
2801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStartInProgress = false;
2802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBufs = NULL;
2803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBufProvider = NULL;
2804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
2805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
2806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
2807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMsgEnabled = 0;
2808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier = NULL;
2809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMemoryManager = NULL;
2810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter = NULL;
2811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingEnabled = false;
2812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingRunning = false;
2813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = NULL;
2814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangePositive = 1;
2815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangeNegative = 1;
2816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = 0;
2817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mShutterEnabled = true;
2818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMeasurementEnabled = false;
2819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataBufs = NULL;
2820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = NULL;
2821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCurrentTime = 0;
2822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mFalsePreview = 0;
2823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageOffsets = NULL;
2824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageLength = 0;
2825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageFd = 0;
2826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoOffsets = NULL;
2827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoFd = 0;
2828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoLength = 0;
2829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataOffsets = NULL;
2830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataFd = 0;
2831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataLength = 0;
2832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewFd = 0;
2833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewWidth = 0;
2834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewHeight = 0;
2835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewLength = 0;
2836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewOffsets = NULL;
2837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewRunning = 0;
2838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStateOld = 0;
2839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = 0;
2840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordEnabled = 0;
2841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = NULL;
284272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoWidth = 0;
284372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoHeight = 0;
2844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Initialize the CameraHAL constructor timestamp, which is used in the
2848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // PPM() method as time reference if the user does not supply one.
2849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&ppm_start, NULL);
2850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraIndex = cameraId;
2854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Destructor of CameraHal
2860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function simply calls deinitialize() to free up memory allocate during construct
2862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   phase
2863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::~CameraHal()
2865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Call de-initialize here once more - it is the last chance for us to relinquish all the h/w and s/w resources
2869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
2870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
2872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
2875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
2876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the callback notifier
2879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier.clear();
2880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the display adapter
2882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayAdapter.clear();
2883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
2885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int strongCount = mCameraAdapter->getStrongCount();
2886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->decStrong(mCameraAdapter);
2888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
2890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2892de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    freeImageBufs();
2893de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
2894de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    /// Free the memory manager
2895de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    mMemoryManager.clear();
2896de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
2897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Initialize the Camera HAL
2902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Creates CameraAdapter, AppCallbackNotifier, DisplayAdapter and MemoryManager
2904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param None
2906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR - On success
2907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         NO_MEMORY - On failure to allocate memory for any of the objects
2908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @remarks Camera Hal internal function
2909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::initialize(CameraProperties::Properties* properties)
2913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int sensor_index = 0;
2917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize the event mask used for registering an event provider for AppCallbackNotifier
2919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Currently, registering all events as to be coming from CameraAdapter
2920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int32_t eventMask = CameraHalEvent::ALL_EVENTS;
2921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Get my camera properties
2923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = properties;
2924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mCameraProperties)
2926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Dump the properties of this Camera
2931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // will only print if DEBUG macro is defined
2932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties->dump();
2933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)) != 0 )
2935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        sensor_index = atoi(mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX));
2937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Sensor index %d", sensor_index);
2940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
29419a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu    mCameraAdapter = CameraAdapter_Factory(sensor_index);
29429a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu    if ( ( NULL == mCameraAdapter ) || (mCameraAdapter->initialize(properties)!=NO_ERROR))
2943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Unable to create or initialize CameraAdapter");
2945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
2946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->incStrong(mCameraAdapter);
2950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerImageReleaseCallback(releaseImageBuffers, (void *) this);
2951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerEndCaptureCallback(endImageCapture, (void *)this);
2952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mAppCallbackNotifier.get())
2954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create the callback notifier
2956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier = new AppCallbackNotifier();
2957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mAppCallbackNotifier.get() ) || ( mAppCallbackNotifier->initialize() != NO_ERROR))
2958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize AppCallbackNotifier");
2960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
2961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mMemoryManager.get())
2965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create Memory Manager
2967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mMemoryManager = new MemoryManager();
2968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mMemoryManager.get() ) || ( mMemoryManager->initialize() != NO_ERROR))
2969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize MemoryManager");
2971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
2972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Setup the class dependencies...
2976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///AppCallbackNotifier has to know where to get the Camera frames and the events like auto focus lock etc from.
2978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///CameraAdapter is the one which provides those events
2979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the frame and event providers for AppCallbackNotifier
2980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@remarks  setEventProvider API takes in a bit mask of events for registering a provider for the different events
2981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         That way, if events can come from DisplayAdapter in future, we will be able to add it as provider
2982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         for any event
2983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setEventProvider(eventMask, mCameraAdapter);
2984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setFrameProvider(mCameraAdapter);
2985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Any dynamic errors that happen during the camera use case has to be propagated back to the application
2987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
2988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the error handler for CameraAdapter
2989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->setErrorHandler(mAppCallbackNotifier.get());
2990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
2992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier->start() != NO_ERROR)
2993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      {
2994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't start AppCallbackNotifier");
2995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      }
2997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Started AppCallbackNotifier..");
2999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
3000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize default parameters
3002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    initDefaultParameters();
3003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( setParameters(mParameters) != NO_ERROR )
3006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Failed to set default parameters?!");
3008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // register for sensor events
3011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = new SensorListener();
3012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
3013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (mSensorListener->initialize() == NO_ERROR) {
3014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->setCallbacks(orientation_cb, this);
3015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->enableSensor(SensorListener::SENSOR_ORIENTATION);
3016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        } else {
3017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Error initializing SensorListener. not fatal, continuing");
3018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener.clear();
3019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener = NULL;
3020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
3026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fail_loop:
3028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Free up the resources because we failed somewhere up
3030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        deinitialize();
3031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
3032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
3034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions)
3038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
3040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status = NO_ERROR;
3041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
3043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedResolutions )
3047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported resolutions string");
3049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status = snprintf(tmpBuffer, PARAM_BUFFER, "%dx%d", width, height);
3054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 > status )
3055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
3057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedResolutions, tmpBuffer);
3062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(const char *param, const char *supportedParams)
3079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
3081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
3082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedParams )
3086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
3088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == param )
3093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid parameter string");
3095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedParams, param);
3100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(int param, const char *supportedParams)
3117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
3119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
3120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status;
3121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedParams )
3126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
3128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status = snprintf(tmpBuffer, PARAM_BUFFER, "%d", param);
3133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 > status )
3134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
3136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedParams, tmpBuffer);
3141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3157f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luustatus_t CameraHal::doesSetParameterNeedUpdate(const char* new_param, const char* old_param, bool& update) {
3158f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if (!new_param || !old_param) {
3159f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        return -EINVAL;
3160f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
3161f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3162f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    // if params mismatch we should update parameters for camera adapter
3163f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if ((strcmp(new_param, old_param) != 0)) {
3164f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu       update = true;
3165f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
3166f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3167f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu   return NO_ERROR;
3168f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu}
3169f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::parseResolution(const char *resStr, int &width, int &height)
3171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
3173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *ctx, *pWidth, *pHeight;
3174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *sep = "x";
3175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *tmp = NULL;
3176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == resStr )
3180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
3182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //This fixes "Invalid input resolution"
3185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *resStr_copy = (char *)malloc(strlen(resStr) + 1);
3186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL!=resStr_copy ) {
3187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        strcpy(resStr_copy, resStr);
3190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pWidth = strtok_r( (char *) resStr_copy, sep, &ctx);
3191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pWidth )
3193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            width = atoi(pWidth);
3195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
3197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
3200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pHeight = strtok_r(NULL, sep, &ctx);
3206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pHeight )
3208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            height = atoi(pHeight);
3210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
3212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
3215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        free(resStr_copy);
3219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        resStr_copy = NULL;
3220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     }
3221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::insertSupportedParams()
3227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters &p = mParameters;
3233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set the name of the camera
3235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CAMERA_NAME, mCameraProperties->get(CameraProperties::CAMERA_NAME));
3236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = atoi(mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES));
3240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS));
3241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES));
3242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
3243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
3244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_THUMBNAIL_SIZES));
3245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE));
3246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_EFFECTS, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS));
3247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES));
3249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES));
3250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING));
3251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MAX));
3252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MIN));
3253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_EV_STEP));
3254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES));
3256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_ISO_VALUES, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES));
3257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM_RATIOS, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_RATIOS));
3258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_ZOOM, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::ZOOM_SUPPORTED));
3260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::SMOOTH_ZOOM_SUPPORTED));
3261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_IPP, mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES));
3262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D_SUPPORTED,mCameraProperties->get(CameraProperties::S3D_SUPPORTED));
3263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D2D_PREVIEW_MODE,mCameraProperties->get(CameraProperties::S3D2D_PREVIEW_MODES));
3264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE));
3265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
32668b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    p.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED));
3267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
3268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED));
3271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED));
32729919dafce4d57f0b9b9aedafc95b756464685009Tyler Luu    p.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, mCameraProperties->get(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED));
3273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::initDefaultParameters()
3279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Purpose of this function is to initialize the default current and supported parameters for the currently
3281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //selected camera.
3282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters &p = mParameters;
3284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentRevision, adapterRevision;
3285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
3286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int width, height;
3287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PREVIEW_SIZE), width, height);
3291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(width, height);
3295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT);
3299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PICTURE_SIZE), width, height);
3302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(width, height);
3306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(PICTURE_WIDTH, PICTURE_HEIGHT);
3310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_SIZE), width, height);
3313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width);
3317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height);
3318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, MIN_WIDTH);
3322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, MIN_HEIGHT);
3323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    insertSupportedParams();
3326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Insert default values
3328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFrameRate(atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)));
3329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFormat(mCameraProperties->get(CameraProperties::PREVIEW_FORMAT));
3330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPictureFormat(mCameraProperties->get(CameraProperties::PICTURE_FORMAT));
3331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_JPEG_QUALITY, mCameraProperties->get(CameraProperties::JPEG_QUALITY));
3332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_WHITE_BALANCE, mCameraProperties->get(CameraProperties::WHITEBALANCE));
3333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EFFECT,  mCameraProperties->get(CameraProperties::EFFECT));
3334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ANTIBANDING, mCameraProperties->get(CameraProperties::ANTIBANDING));
3335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FOCUS_MODE, mCameraProperties->get(CameraProperties::FOCUS_MODE));
3337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::EV_COMPENSATION));
3338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SCENE_MODE, mCameraProperties->get(CameraProperties::SCENE_MODE));
3339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM, mCameraProperties->get(CameraProperties::ZOOM));
3341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CONTRAST, mCameraProperties->get(CameraProperties::CONTRAST));
3342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SATURATION, mCameraProperties->get(CameraProperties::SATURATION));
3343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_BRIGHTNESS, mCameraProperties->get(CameraProperties::BRIGHTNESS));
3344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SHARPNESS, mCameraProperties->get(CameraProperties::SHARPNESS));
3345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXPOSURE_MODE, mCameraProperties->get(CameraProperties::EXPOSURE_MODE));
3346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_ISO, mCameraProperties->get(CameraProperties::ISO_MODE));
3347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_IPP, mCameraProperties->get(CameraProperties::IPP));
3348d054c26243e4cf49e5fe04789e4437e5e0f3f574Sundar Raman    p.set(TICameraParameters::KEY_GBCE, mCameraProperties->get(CameraProperties::GBCE));
3349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D2D_PREVIEW, mCameraProperties->get(CameraProperties::S3D2D_PREVIEW));
3350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_AUTOCONVERGENCE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE));
3351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
33528b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    p.set(CameraParameters::KEY_VIDEO_STABILIZATION, mCameraProperties->get(CameraProperties::VSTAB));
3353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FOCAL_LENGTH, mCameraProperties->get(CameraProperties::FOCAL_LENGTH));
3354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::HOR_ANGLE));
3355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::VER_ANGLE));
3356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
3357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MAKE, mCameraProperties->get(CameraProperties::EXIF_MAKE));
3360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MODEL, mCameraProperties->get(CameraProperties::EXIF_MODEL));
3361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_QUALITY));
3362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, "OMX_TI_COLOR_FormatYUV420PackedSemiPlanar");
3363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, mCameraProperties->get(CameraProperties::MAX_FD_HW_FACES));
3364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, mCameraProperties->get(CameraProperties::MAX_FD_SW_FACES));
3365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Only one area a.k.a Touch AF for now.
3367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // TODO: Add support for multiple focus areas.
3368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, mCameraProperties->get(CameraProperties::MAX_FOCUS_AREAS));
3369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK));
3370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK));
3371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, mCameraProperties->get(CameraProperties::MAX_NUM_METERING_AREAS));
3372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
3378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
3380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::forceStopPreview()
3383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // stop bracketing if it is running
3387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    stopImageBracketing();
3388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() != NULL) {
3390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Stop the buffer display first
3391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->disableDisplay();
3392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier.get() != NULL) {
3395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Stop the callback sending
3396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stop();
339726d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu        mAppCallbackNotifier->flushAndReturnFrames();
3398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stopPreviewCallbacks();
3399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
3402342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // only need to send these control commands to state machine if we are
3403342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // passed the LOADED_PREVIEW_STATE
3404a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        if (mCameraAdapter->getState() > CameraAdapter::LOADED_PREVIEW_STATE) {
3405342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // according to javadoc...FD should be stopped in stopPreview
3406342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // and application needs to call startFaceDection again
3407342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // to restart FD
3408342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
3409342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
3410342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu
3411a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        mCameraAdapter->rollbackToInitializedState();
3412a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
3413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewBufs();
3416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewDataBufs();
3417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
3419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
3420342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu    mPreviewStartInProgress = false;
3421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Deallocates memory for all the resources held by Camera HAL.
3427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter,
3429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   and Memory Manager
3430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
3433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::deinitialize()
3436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3439f5094850dd99854af026e16bd21d8555a5168afbSundar Raman    if ( mPreviewEnabled || mDisplayPaused ) {
3440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        forceStopPreview();
3441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
3444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
3446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION);
3447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener.clear();
3448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener = NULL;
3449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::storeMetaDataInBuffers(bool enable)
3456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mAppCallbackNotifier->useMetaDataBufferMode(enable);
3460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3464a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boatengvoid CameraHal::selectFPSRange(int framerate, int *min_fps, int *max_fps)
3465a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng{
3466a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  char * ptr;
3467a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  char supported[MAX_PROP_VALUE_LENGTH];
3468a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  int fpsrangeArray[2];
3469a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  int i = 0;
3470a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3471a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  LOG_FUNCTION_NAME;
3472a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  size_t size = strlen(mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))+1;
3473a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  strncpy(supported, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED), size);
3474a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3475a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  ptr = strtok (supported," (,)");
3476a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3477a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  while (ptr != NULL)
3478a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng    {
3479a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      fpsrangeArray[i]= atoi(ptr)/CameraHal::VFR_SCALE;
3480a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      if (i == 1)
3481a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng        {
3482a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          if (framerate == fpsrangeArray[i])
3483a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng            {
3484a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              CAMHAL_LOGDB("SETTING FPS RANGE min = %d max = %d \n", fpsrangeArray[0], fpsrangeArray[1]);
3485d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman              *min_fps = fpsrangeArray[0]*CameraHal::VFR_SCALE;
3486d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman              *max_fps = fpsrangeArray[1]*CameraHal::VFR_SCALE;
3487a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              break;
3488a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng            }
3489a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng        }
3490a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      ptr = strtok (NULL, " (,)");
3491a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      i++;
3492a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      i%=2;
3493a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng    }
3494a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3495a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
3496a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3497a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng}
3498a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
349972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengvoid CameraHal::setPreferredPreviewRes(int width, int height)
350072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
350172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
350272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
350372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width == 320) && (height == 240)){
350472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParameters.setPreviewSize(640,480);
350572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
350672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width == 176) && (height == 144)){
350772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParameters.setPreviewSize(704,576);
350872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
350972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
351072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
351172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
351272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
351372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengvoid CameraHal::resetPreviewRes(CameraParameters *mParams, int width, int height)
351472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
351572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
351672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
351772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width <= 320) && (height <= 240)){
351872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParams->setPreviewSize(mVideoWidth, mVideoHeight);
351972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
352072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
352172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
352272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
352372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
3524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
3525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3527