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    const char *valstr = NULL;
251a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    int varint = 0;
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
253a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    CameraParameters oldParams = mParameters;
254b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Needed for KEY_RECORDING_HINT
255b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
256f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    bool updateRequired = false;
257381ec2390c3d9d6ba3b67cf53e69fec96e7a7bd1Akwasi Boateng    bool videoMode = false;
258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
259b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    {
260b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        Mutex::Autolock lock(mLock);
261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
262b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Ensure that preview is not enabled when the below parameters are changed.
263b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(!previewEnabled())
264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
266b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("PreviewFormat %s", params.getPreviewFormat());
267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2683a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ((valstr = params.getPreviewFormat()) != NULL) {
2693a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS))) {
2703a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    mParameters.setPreviewFormat(valstr);
2713a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                } else {
2723a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    CAMHAL_LOGEB("Invalid preview format.Supported: %s",  mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
273a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    return BAD_VALUE;
274b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
2753a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
276b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
277a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            varint = params.getInt(TICameraParameters::KEY_VNF);
278a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            valstr = params.get(TICameraParameters::KEY_VNF);
279a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            if ( valstr != NULL ) {
280a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                if ( ( varint == 0 ) || ( varint == 1 ) ) {
281a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    CAMHAL_LOGDB("VNF set %s", valstr);
282a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    mParameters.set(TICameraParameters::KEY_VNF, varint);
283f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                } else {
284f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid VNF: %s", valstr);
285a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    return BAD_VALUE;
286b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
287f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
288b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2898b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            if ((valstr = params.get(CameraParameters::KEY_VIDEO_STABILIZATION)) != NULL) {
2908b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                // make sure we support vstab...if we don't and application is trying to set
2918b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                // vstab then return an error
2928b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
2938b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                           CameraParameters::TRUE) == 0) {
294a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    CAMHAL_LOGDB("VSTAB %s",valstr);
295a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION, valstr);
2968b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                } else if (strcmp(valstr, CameraParameters::TRUE) == 0) {
297f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid VSTAB: %s", valstr);
298a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    return BAD_VALUE;
2998b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                } else {
3008b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                    mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION,
3018b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                                    CameraParameters::FALSE);
302b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
303f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
304b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
305a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
306a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
307b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL)
308b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
309a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                CAMHAL_LOGDB("Capture mode set %s", valstr);
310b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_CAP_MODE, valstr);
311b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
312b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
313f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((valstr = params.get(TICameraParameters::KEY_IPP)) != NULL) {
314f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES))) {
315a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    CAMHAL_LOGDB("IPP mode set %s", valstr);
316f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    mParameters.set(TICameraParameters::KEY_IPP, valstr);
317f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                } else {
318f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid IPP mode: %s", valstr);
319a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                    return BAD_VALUE;
320b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
321f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
322b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
323a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
324a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
325b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if((valstr = params.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL)
326b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
327b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Stereo 3D->2D Preview mode is %s", params.get(TICameraParameters::KEY_S3D2D_PREVIEW));
328b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_S3D2D_PREVIEW, valstr);
329b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
330b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
331b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if((valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL)
332b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
333b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("AutoConvergence mode is %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE));
334b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr);
335b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
336a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
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");
343a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
3443a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              }
3453a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3463a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            int oldWidth, oldHeight;
3473a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            mParameters.getPreviewSize(&oldWidth, &oldHeight);
3483a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
349a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
350a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
3513a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            int orientation =0;
3523a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if((valstr = params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)) != NULL)
3533a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3543a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGDB("Sensor Orientation is set to %s", params.get(TICameraParameters::KEY_SENSOR_ORIENTATION));
3553a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.set(TICameraParameters::KEY_SENSOR_ORIENTATION, valstr);
3563a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                orientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION);
3573a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3583a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3593a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if(orientation ==90 || orientation ==270)
3603a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           {
3613a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              if ( !isResolutionValid(h,w, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
3623a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               {
3633a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
364a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
3653a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               }
3663a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              else
3673a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              {
3683a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.setPreviewSize(w, h);
36972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoWidth = w;
37072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoHeight = h;
3713a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               }
3723a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           }
3733a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           else
3743a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           {
3753a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ( !isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
3763a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3773a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
378a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
3793a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3803a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            else
3813a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3823a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.setPreviewSize(w, h);
3833a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3843a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           }
3853a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3863a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
387a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#else
388a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
389a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if ( !isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES))) {
390a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
391a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            return BAD_VALUE;
392a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        } else {
393a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            mParameters.setPreviewSize(w, h);
394a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        }
395a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
396a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
397a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
398a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if ( ( oldWidth != w ) || ( oldHeight != h ) ) {
399a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            restartPreviewRequired |= true;
400a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        }
401a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
402a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        CAMHAL_LOGDB("PreviewResolution by App %d x %d", w, h);
4033a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
404b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
405b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        valstr = params.get(CameraParameters::KEY_RECORDING_HINT);
406b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(valstr != NULL)
407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
408b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if(strcmp(valstr, CameraParameters::TRUE) == 0)
409b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
410b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
411b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
412381ec2390c3d9d6ba3b67cf53e69fec96e7a7bd1Akwasi Boateng                videoMode = true;
41372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                int w, h;
41472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
41572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                params.getPreviewSize(&w, &h);
41672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Preview Width=%d Height=%d\n", __FUNCTION__, w, h);
41772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                //HACK FOR MMS
41872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoWidth = w;
41972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoHeight = h;
42072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Video Width=%d Height=%d\n", __FUNCTION__, mVideoWidth, mVideoHeight);
42172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
42272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                setPreferredPreviewRes(w, h);
42372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mParameters.getPreviewSize(&w, &h);
42472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Preview Width=%d Height=%d\n", __FUNCTION__, w, h);
4253dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                //Avoid restarting preview for MMS HACK
4263dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                if ((w != mVideoWidth) && (h != mVideoHeight))
4273dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                    {
4283dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                    restartPreviewRequired = false;
4293dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                    }
43072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
4313dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                restartPreviewRequired |= setVideoModeParameters(params);
432b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
433b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else if(strcmp(valstr, CameraParameters::FALSE) == 0)
434b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
435b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
436b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
437ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu                restartPreviewRequired |= resetVideoModeParameters();
43872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                params.getPreviewSize(&mVideoWidth, &mVideoHeight);
439b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
440b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
441b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
442b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGEA("Invalid RECORDING_HINT");
443a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
444b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
448b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // This check is required in following case.
449b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // If VideoRecording activity sets KEY_RECORDING_HINT to TRUE and
450b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // ImageCapture activity doesnot set KEY_RECORDING_HINT to FALSE (i.e. simply NULL),
451b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // then Video Mode parameters may remain present in ImageCapture activity as well.
452b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Recording Hint is set to NULL");
453b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_RECORDING_HINT, "");
454ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu            restartPreviewRequired |= resetVideoModeParameters();
45572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            params.getPreviewSize(&mVideoWidth, &mVideoHeight);
456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4589743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) {
4599743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) {
460a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                CAMHAL_LOGDB("Focus mode set %s", valstr);
4619743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
4629743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                // we need to take a decision on the capture mode based on whether CAF picture or
4639743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                // video is chosen so the behavior of each is consistent to the application
4649743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                if(strcmp(valstr, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0){
4659743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                    restartPreviewRequired |= resetVideoModeParameters();
4669743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                } else if (strcmp(valstr, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) == 0){
4679743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                    restartPreviewRequired |= setVideoModeParameters(params);
4689743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                }
4699743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
4709743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                mParameters.set(CameraParameters::KEY_FOCUS_MODE, valstr);
4719743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu             } else {
4729743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr);
473a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
4749743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu             }
4759743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        }
4769743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
477b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Below parameters can be changed when the preview is running
478f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ( (valstr = params.getPictureFormat()) != NULL ) {
479a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) {
480f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.setPictureFormat(valstr);
481f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
482f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr);
483a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
485a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        }
486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
487b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        params.getPictureSize(&w, &h);
488f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ( isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES))) {
489b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.setPictureSize(w, h);
490f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        } else {
491f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            CAMHAL_LOGEB("ERROR: Invalid picture resolution %dx%d", w, h);
492a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            return BAD_VALUE;
493f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
495b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Picture Size by App %d x %d", w, h);
496b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
497a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
498a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
499f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) {
500f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BURST) >=0) {
501a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                CAMHAL_LOGDB("Burst set %s", valstr);
502f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BURST, valstr);
503f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
504f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr);
505a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
507f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
509a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
510a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
511b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        framerate = params.getPreviewFrameRate();
512524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        valstr = params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
513b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("FRAMERATE %d", framerate);
514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
515524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGVB("Passed FRR: %s, Supported FRR %s", valstr
516524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
517524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGVB("Passed FR: %d, Supported FR %s", framerate
518524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
519524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
520524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
521524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        //Perform parameter validation
522524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if(!isParameterValid(valstr
523524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))
524524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        || !isParameterValid(framerate,
525524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                                      mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES)))
526524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        {
527524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("Invalid frame rate range or frame rate");
528a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            return BAD_VALUE;
529524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        }
530524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
5311521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // Variable framerate ranges have higher priority over
5321521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // deprecated constant FPS. "KEY_PREVIEW_FPS_RANGE" should
5331521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // be cleared by the client in order for constant FPS to get
5341521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // applied.
535524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( strcmp(valstr, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE))  != 0)
536a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
537524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            // APP wants to set FPS range
538524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            //Set framerate = MAXFPS
539524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGDA("APP IS CHANGING FRAME RATE RANGE");
540b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            params.getPreviewFpsRange(&minFPS, &maxFPS);
541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
542b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( ( 0 > minFPS ) || ( 0 > maxFPS ) )
543a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              {
544f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEA("ERROR: FPS Range is negative!");
545a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
546a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              }
547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
548524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            framerate = maxFPS /CameraHal::VFR_SCALE;
549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
550524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          }
551524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        else
552524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          {
553524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman              if ( framerate != atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)) )
554a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              {
555d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman
556524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                selectFPSRange(framerate, &minFPS, &maxFPS);
557d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman                CAMHAL_LOGDB("Select FPS Range %d %d", minFPS, maxFPS);
558a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              }
559524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman              else
560524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                {
561524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    if (videoMode) {
562524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_VIDEO);
563524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        CameraParameters temp;
564524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
565524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
566524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    }
567524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    else {
568524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_IMAGE);
569524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        CameraParameters temp;
570524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
571524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
572524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    }
573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
574524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    framerate = maxFPS / CameraHal::VFR_SCALE;
575524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                }
576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
577524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          }
578a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
579524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("FPS Range = %s", valstr);
580524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("DEFAULT FPS Range = %s", mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
582524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        minFPS /= CameraHal::VFR_SCALE;
583524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        maxFPS /= CameraHal::VFR_SCALE;
584524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
585524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( ( 0 == minFPS ) || ( 0 == maxFPS ) )
586a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
587524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("ERROR: FPS Range is invalid!");
588a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            return BAD_VALUE;
589a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          }
590524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
591524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( maxFPS < minFPS )
592a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
593524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("ERROR: Max FPS is smaller than Min FPS!");
594a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            return BAD_VALUE;
595a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          }
596524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
597524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.setPreviewFrameRate(framerate);
59808bd593a76c52f567ab844a9d92a9ffa2fe47ee9Sundar Raman        mParameters.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE));
599524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
600524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("FPS Range [%d, %d]", minFPS, maxFPS);
601524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.set(TICameraParameters::KEY_MINFRAMERATE, minFPS);
602524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.set(TICameraParameters::KEY_MAXFRAMERATE, maxFPS);
603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
604b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( valstr = params.get(TICameraParameters::KEY_GBCE) ) != NULL )
605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
606b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GBCE Value = %s", valstr);
607b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GBCE, valstr);
608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
610b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( valstr = params.get(TICameraParameters::KEY_GLBCE) ) != NULL )
611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
612b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GLBCE Value = %s", valstr);
613b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GLBCE, valstr);
614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
616a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
617a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
618b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Update the current parameter set
619b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL)
620b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
621b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("AutoConvergence Mode is set = %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE));
622b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr);
6231521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu            }
624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
625b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES)) !=NULL )
626b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
627b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("ManualConvergence Value = %s", params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES));
628b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, valstr);
629b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
631f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_EXPOSURE_MODE)) != NULL) {
632f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES))) {
633f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Exposure set = %s", valstr);
634f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr);
635f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
636f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Exposure  = %s", valstr);
637a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
638b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
639f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
641a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
642a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
643f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_WHITE_BALANCE)) != NULL) {
644f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu           if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) {
645f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGDB("White balance set %s", valstr);
646f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               mParameters.set(CameraParameters::KEY_WHITE_BALANCE, valstr);
647f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
648f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGEB("ERROR: Invalid white balance  = %s", valstr);
649a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev               return BAD_VALUE;
650b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
651f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
653a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
654a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
655f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) {
656f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) {
657f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Contrast set %s", valstr);
658f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_CONTRAST, valstr);
659f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
660f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Contrast  = %s", valstr);
661a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
662b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
663f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
665f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr =params.get(TICameraParameters::KEY_SHARPNESS)) != NULL) {
666f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SHARPNESS) >= 0 ) {
667f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Sharpness set %s", valstr);
668f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr);
669f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
670f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr);
671a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
672b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
673f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
675f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_SATURATION)) != NULL) {
676f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SATURATION) >= 0 ) {
677f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Saturation set %s", valstr);
678f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SATURATION, valstr);
679f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
680f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr);
681a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
682b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
683f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
685f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BRIGHTNESS)) != NULL) {
686f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BRIGHTNESS) >= 0 ) {
687f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Brightness set %s", valstr);
688f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr);
689f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
690f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr);
691a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
692f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
693f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
694f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu
695a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
696a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
697f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_ANTIBANDING)) != NULL) {
698f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) {
699f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Antibanding set %s", valstr);
700f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_ANTIBANDING, valstr);
701f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
702f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr);
703a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
704f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
705f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
706f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu
707a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
708a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
709f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) {
710f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) {
711f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("ISO set %s", valstr);
712f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_ISO, valstr);
713f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
714f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr);
715a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
716b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
717f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
719a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
720a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
721b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_FOCUS_AREAS)) != NULL )
722b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
723a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Focus areas position set %s",valstr);
724b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_FOCUS_AREAS, valstr);
725b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
727a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
728a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
729b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL )
730b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
731b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Measurements set to %s", params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE));
732b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_MEASUREMENT_ENABLE, valstr);
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
734b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_ENABLE) == 0)
735b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
736b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = true;
737b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
738b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_DISABLE) == 0)
739b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
740b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
741b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
742b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
743b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
744b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
745b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
747b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
749a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
750a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
751b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL)
752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
753a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Exposure compensation set %s", valstr);
754b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr);
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
756b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
757f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_SCENE_MODE)) != NULL) {
758f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES))) {
759f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Scene mode set %s", valstr);
760759396a116bb2caf006405777a626fe9a8708114Tyler Luu                doesSetParameterNeedUpdate(valstr,
761759396a116bb2caf006405777a626fe9a8708114Tyler Luu                                           mParameters.get(CameraParameters::KEY_SCENE_MODE),
762759396a116bb2caf006405777a626fe9a8708114Tyler Luu                                           updateRequired);
763f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_SCENE_MODE, valstr);
764f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
765f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr);
766a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
768f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
769b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
770f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_FLASH_MODE)) != NULL) {
771f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES))) {
772f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Flash mode set %s", valstr);
773f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_FLASH_MODE, valstr);
774f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
775f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr);
776a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
778f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
780f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_EFFECT)) != NULL) {
781f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS))) {
782f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Effect set %s", valstr);
783f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_EFFECT, valstr);
784f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
785f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr);
786a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
787f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
788f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
790a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        varint = params.getInt(CameraParameters::KEY_ROTATION);
791a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if( varint >=0 )
792b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
793a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Rotation set %d", varint);
794a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            mParameters.set(CameraParameters::KEY_ROTATION, varint);
795b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
797a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        varint = params.getInt(CameraParameters::KEY_JPEG_QUALITY);
798a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if( varint >= 0 )
799b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
800a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Jpeg quality set %d", varint);
801a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            mParameters.set(CameraParameters::KEY_JPEG_QUALITY, varint);
802b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
804a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
805a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if( varint >=0 )
806b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
807a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Thumbnail width set %d", varint);
808a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, varint);
809b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
811a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
812a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if( varint >=0 )
813b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
814a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Thumbnail width set %d", varint);
815a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, varint);
816b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
818a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        varint = params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
819a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if( varint >=0 )
820b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
821a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Thumbnail quality set %d", varint);
822a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, varint);
823b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
825b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_LATITUDE)) != NULL )
826b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
827a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("GPS latitude set %s", valstr);
828b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_LATITUDE, valstr);
829b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
830b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_LATITUDE);
831b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
833b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_LONGITUDE)) != NULL )
834b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
835a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("GPS longitude set %s", valstr);
836b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_LONGITUDE, valstr);
837b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
838b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_LONGITUDE);
839b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
841b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_ALTITUDE)) != NULL )
842b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
843a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("GPS altitude set %s", valstr);
844b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_ALTITUDE, valstr);
845b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
846b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_ALTITUDE);
847b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
849b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_TIMESTAMP)) != NULL )
850b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
851a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("GPS timestamp set %s", valstr);
852b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_TIMESTAMP, valstr);
853b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
854b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_TIMESTAMP);
855b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
857b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL )
858b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
859a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("GPS datestamp set %s", valstr);
860b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr);
861b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
862b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP);
863b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
865b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL )
866b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
867a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("GPS processing method set %s", valstr);
868b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr);
869b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
870b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD);
871b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
873b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL )
874b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
875a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr);
876b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr);
877b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
878b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM);
879b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
881b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL )
882b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
883a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr);
884b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr);
885b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
886b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_VERSION);
887b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
889b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL )
890b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
891a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("EXIF Model set %s", valstr);
892b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr);
893b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
895b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL )
896b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
897a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("EXIF Make set %s", valstr);
898b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr);
899b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
901a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
902a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
903b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL )
904b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
905b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE));
906b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valstr);
907b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
908b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else
909b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
910b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
911b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
913a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
914a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
915a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        valstr = params.get(CameraParameters::KEY_ZOOM);
916a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        varint = params.getInt(CameraParameters::KEY_ZOOM);
917a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if ( valstr != NULL ) {
918a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            if ( ( varint >= 0 ) && ( varint <= mMaxZoomSupported ) ) {
919f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Zoom set %s", valstr);
920f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                doesSetParameterNeedUpdate(valstr,
921f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                           mParameters.get(CameraParameters::KEY_ZOOM),
922f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                           updateRequired);
923f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_ZOOM, valstr);
924f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
925f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr);
926a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                return BAD_VALUE;
927b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
928f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
930b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL )
931b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
932a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Auto Exposure Lock set %s", valstr);
933f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
934f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       mParameters.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK),
935f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
936b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr);
937b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
939b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL )
940b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
941a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", valstr);
942f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
943f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       mParameters.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK),
944f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
945b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr);
946b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
947708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        if( (valstr = params.get(CameraParameters::KEY_METERING_AREAS)) != NULL )
948708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            {
949a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            CAMHAL_LOGDB("Metering areas position set %s", valstr);
950708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            mParameters.set(CameraParameters::KEY_METERING_AREAS, valstr);
951708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            }
952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
953b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        // Only send parameters to adapter if preview is already
954f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter,
955f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // will be called in startPreview()
956f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // TODO(XXX): Need to identify other parameters that need update from camera adapter
957f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        if ( (NULL != mCameraAdapter) && (mPreviewEnabled || updateRequired) ) {
958a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            ret |= mCameraAdapter->setParameters(mParameters);
959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
961a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT
962a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
963b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) )
964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
965b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS);
966b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( 0 < posBracketRange )
967b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
968b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketRangePositive = posBracketRange;
969b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
971b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Positive bracketing range %d", mBracketRangePositive);
972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
974b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG) )
975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
976b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            int negBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG);
977b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( 0 < negBracketRange )
978b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
979b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketRangeNegative = negBracketRange;
980b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
982b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Negative bracketing range %d", mBracketRangeNegative);
983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
984b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL) &&
985b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::BRACKET_ENABLE) == 0 ))
986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
987b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( !mBracketingEnabled )
988b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
989b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Enabling bracketing");
990b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketingEnabled = true;
991b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
992b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                //Wait for AF events to enable bracketing
993b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                if ( NULL != mCameraAdapter )
994b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    {
995b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    setEventProvider( CameraHalEvent::ALL_EVENTS, mCameraAdapter );
996b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    }
997b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
998b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1000b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Bracketing already enabled");
1001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1003b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else if ( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL ) &&
1004b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::BRACKET_DISABLE) == 0 ))
1005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1006b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling bracketing");
1007b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1008b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mBracketingEnabled = false;
1009b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            stopImageBracketing();
1010b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1011b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            //Remove AF events subscription
1012b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( NULL != mEventProvider )
1013b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
1014b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mEventProvider->disableEventNotification( CameraHalEvent::ALL_EVENTS );
1015b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                delete mEventProvider;
1016b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mEventProvider = NULL;
1017b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
1018b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1021b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
1022b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::SHUTTER_ENABLE) == 0 ))
1023b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
1024b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Enabling shutter sound");
1025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1026b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = true;
1027b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled |= CAMERA_MSG_SHUTTER;
1028b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
1029b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
1030b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else if ( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
1031b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::SHUTTER_DISABLE) == 0 ))
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1033b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling shutter sound");
1034b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1035b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = false;
1036b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled &= ~CAMERA_MSG_SHUTTER;
1037b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1040a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif
1041a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev
1042b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1044b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    //On fail restore old parameters
1045b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    if ( NO_ERROR != ret ) {
1046a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        mParameters = oldParams;
1047b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    }
1048b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman
1049b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running.
1050b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // If preview is not started yet, Video Mode parameters will take effect on next startPreview()
10513dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng    if (restartPreviewRequired && previewEnabled() && !mRecordingEnabled) {
1052ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        CAMHAL_LOGDA("Restarting Preview");
1053b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ret = restartPreview();
10543dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng    } else if (restartPreviewRequired && !previewEnabled() &&
10553dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng                mDisplayPaused && !mRecordingEnabled) {
1056ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        CAMHAL_LOGDA("Stopping Preview");
1057ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        forceStopPreview();
1058ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu    }
1059ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu
1060b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if (ret != NO_ERROR)
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1062b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGEA("Failed to restart Preview");
1063b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        return ret;
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1069b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        unsigned int buffercount, unsigned int &max_queueable)
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() == NULL)
1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Memory allocation of preview buffers is now placed in gralloc
1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // CameraHal should not allocate preview buffers without DisplayAdapter
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mPreviewBufs)
1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///@todo Pluralise the name of this method to allocateBuffers
1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewLength = 0;
1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewBufs = (int32_t *) mDisplayAdapter->allocateBuffer(width, height,
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    previewFormat,
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    mPreviewLength,
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    buffercount);
1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (NULL == mPreviewBufs ) {
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview buffers");
1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_MEMORY;
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets();
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == mPreviewOffsets ) {
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Buffer mapping failed");
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return BAD_VALUE;
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewFd = mDisplayAdapter->getFd();
1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( -1 == mPreviewFd ) {
1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Invalid handle");
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return BAD_VALUE;
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          }
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBufProvider = (BufferProvider*) mDisplayAdapter.get();
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->maxQueueableBuffers(max_queueable);
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (ret != NO_ERROR) {
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewBufs()
1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("mPreviewBufs = 0x%x", (unsigned int)mPreviewBufs);
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mPreviewBufs)
1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///@todo Pluralise the name of this method to freeBuffers
1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mBufProvider->freeBuffer(mPreviewBufs);
1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewBufs = NULL;
1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount)
1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int bytes;
1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bytes = size;
1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mPreviewDataBufs )
1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = freePreviewDataBufs();
1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1164c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman        bytes = ((bytes+4095)/4096)*4096;
1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, NULL, bytes, bufferCount);
1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes);
1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL == mPreviewDataBufs )
1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -NO_MEMORY;
1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes = size;
1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = mMemoryManager->getFd();
1182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = bytes;
1183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = mMemoryManager->getOffsets();
1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = -1;
1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = 0;
1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = NULL;
1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewDataBufs()
1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mPreviewDataBufs )
1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@todo Pluralise the name of this method to freeBuffers
1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mMemoryManager->freeBuffer(mPreviewDataBufs);
1211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mPreviewDataBufs = NULL;
1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size, const char* previewFormat, unsigned int bufferCount)
1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int bytes;
1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bytes = size;
1229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1230fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    // allocate image buffers only if not already allocated
1231fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if(NULL != mImageBufs) {
1232fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu        return NO_ERROR;
1233fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
1234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1237c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman        bytes = ((bytes+4095)/4096)*4096;
1238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, previewFormat, bytes, bufferCount);
1239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes);
1241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL == mImageBufs )
1242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -NO_MEMORY;
1245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes = size;
1249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = mMemoryManager->getFd();
1255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = bytes;
1256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = mMemoryManager->getOffsets();
1257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = -1;
1261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = 0;
1262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = NULL;
1263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
127072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengstatus_t CameraHal::allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount)
127172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
127272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  status_t ret = NO_ERROR;
127372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
127472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
127572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if( NULL != mVideoBufs ){
127672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    ret = freeVideoBufs(mVideoBufs);
127772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoBufs = NULL;
127872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
127972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
128072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( NO_ERROR == ret ){
128172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    int32_t stride;
128272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    buffer_handle_t *bufsArr = new buffer_handle_t [bufferCount];
128372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
128472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if (bufsArr != NULL){
128572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      for (int i = 0; i< bufferCount; i++){
128672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        GraphicBufferAllocator &GrallocAlloc = GraphicBufferAllocator::get();
128772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        buffer_handle_t buf;
128872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        ret = GrallocAlloc.alloc(width, height, HAL_PIXEL_FORMAT_NV12, CAMHAL_GRALLOC_USAGE, &buf, &stride);
128972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if (ret != NO_ERROR){
129072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          CAMHAL_LOGEA("Couldn't allocate video buffers using Gralloc");
129172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          ret = -NO_MEMORY;
129272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          for (int j=0; j< i; j++){
129372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            buf = (buffer_handle_t)bufsArr[j];
129472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            CAMHAL_LOGEB("Freeing Gralloc Buffer 0x%x", buf);
129572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            GrallocAlloc.free(buf);
129672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
129772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          delete [] bufsArr;
129872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          goto exit;
129972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        }
130072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        bufsArr[i] = buf;
130172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGVB("*** Gralloc Handle =0x%x ***", buf);
130272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
130372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
130472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      mVideoBufs = (int32_t *)bufsArr;
130572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
130672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    else{
130772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      CAMHAL_LOGEA("Couldn't allocate video buffers ");
130872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      ret = -NO_MEMORY;
130972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
131072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
131172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
131272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng exit:
131372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
131472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
131572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  return ret;
131672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
131772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid endImageCapture( void *userData)
1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != userData )
1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->signalEndImageCapture();
1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid releaseImageBuffers(void *userData)
1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1335fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    if (NULL != userData) {
1336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->freeImageBufs();
1338fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu    }
1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::signalEndImageCapture()
1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w,h;
1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters adapterParams = mParameters;
1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
135288006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    if ( mBracketingRunning ) {
135388006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        stopImageBracketing();
135488006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    } else {
135588006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
135688006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    }
1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freeImageBufs()
1364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mImageBufs )
1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@todo Pluralise the name of this method to freeBuffers
1376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mMemoryManager->freeBuffer(mImageBufs);
1377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mImageBufs = NULL;
1378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
1383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
139272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengstatus_t CameraHal::freeVideoBufs(void *bufs)
139372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
139472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  status_t ret = NO_ERROR;
1395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
139672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
139772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
139872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  buffer_handle_t *pBuf = (buffer_handle_t*)bufs;
139972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
140072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if(pBuf == NULL)
140172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    {
140272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      CAMHAL_LOGEA("NULL pointer passed to freeVideoBuffer");
140372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      LOG_FUNCTION_NAME_EXIT;
140472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      return BAD_VALUE;
140572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
140672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
140772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  GraphicBufferAllocator &GrallocAlloc = GraphicBufferAllocator::get();
140872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
140972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  for(int i = 0; i < count; i++){
141072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    buffer_handle_t ptr = *pBuf++;
141172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    CAMHAL_LOGVB("Free Video Gralloc Handle 0x%x", ptr);
141272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    GrallocAlloc.free(ptr);
141372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
141472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
141572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
141672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
141772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  return ret;
141872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
1419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start preview mode.
1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Camera switched to VF mode
1425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update function header with the different errors that are possible
1426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startPreview()
1429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
1433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
1434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int required_buffer_count;
1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int max_queueble_buffers;
1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartPreview, NULL);
1440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
14447016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if ( mPreviewEnabled ){
14457016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      CAMHAL_LOGDA("Preview already running");
14467016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      LOG_FUNCTION_NAME_EXIT;
14477016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      return ALREADY_EXISTS;
1448e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1449e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1450e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    if ( NULL != mCameraAdapter ) {
14517016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->setParameters(mParameters);
14527016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    }
14537016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng
14547016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if ((mPreviewStartInProgress == false) && (mDisplayPaused == false)){
14557016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW,( int ) &frame);
14567016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      if ( NO_ERROR != ret ){
14577016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        CAMHAL_LOGEB("Error: CAMERA_QUERY_RESOLUTION_PREVIEW %d", ret);
14587016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        return ret;
14597016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      }
14607016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng
14617016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ///Update the current preview width and height
14627016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewWidth = frame.mWidth;
14637016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewHeight = frame.mHeight;
14647016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      //Update the padded width and height - required for VNF and VSTAB
14657016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mParameters.set(TICameraParameters::KEY_PADDED_WIDTH, mPreviewWidth);
14667016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mParameters.set(TICameraParameters::KEY_PADDED_HEIGHT, mPreviewHeight);
1467e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1468e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1469e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1470e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    ///If we don't have the preview callback enabled and display adapter,
14717016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL)){
147241a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev      CAMHAL_LOGDA("Preview not started. Preview in progress flag set");
14737016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewStartInProgress = true;
14747016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SWITCH_TO_EXECUTING);
14757016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      if ( NO_ERROR != ret ){
14767016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        CAMHAL_LOGEB("Error: CAMERA_SWITCH_TO_EXECUTING %d", ret);
14777016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        return ret;
14787016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      }
14797016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      return NO_ERROR;
1480e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1481e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) )
1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Preview is in paused state");
1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayPaused = false;
1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewEnabled = true;
1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("Display adapter resume failed %x", ret);
1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //restart preview callbacks
1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME);
1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1502ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        return ret;
1503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
1507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Allocate the preview buffers
15097016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    ret = allocPreviewBufs(mPreviewWidth, mPreviewHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
1510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR != ret )
1512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't allocate buffers for Preview");
1514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mMeasurementEnabled )
1518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA,
1521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          ( int ) &frame,
1522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          required_buffer_count);
1523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
1524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ///Allocate the preview data buffers
1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = allocPreviewDataBufs(frame.mLength, required_buffer_count);
1530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret ) {
1531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview data buffers");
1532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto error;
1533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev           }
1534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mPreviewDataBufs;
1538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mPreviewDataOffsets;
1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mPreviewDataFd;
1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mPreviewDataLength;
1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) required_buffer_count;
1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = (size_t) required_buffer_count;
1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA,
1545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        ( int ) &desc);
1546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Pass the buffers to Camera Adapter
1551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mBuffers = mPreviewBufs;
1552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mOffsets = mPreviewOffsets;
1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mFd = mPreviewFd;
1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mLength = mPreviewLength;
1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mCount = ( size_t ) required_buffer_count;
1556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mMaxQueueable = (size_t) max_queueble_buffers;
1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
15588fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW,
15598fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman                                      ( int ) &desc);
15608fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman
15618fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    if ( NO_ERROR != ret )
15628fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        {
15638fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret);
15648fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        freePreviewBufs();
15658fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        return ret;
15668fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        }
1567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count);
1569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mAppCallbackNotifier->start();
1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( ALREADY_EXISTS == ret )
1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Already running, do nothing
1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("AppCallbackNotifier already running");
1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_ERROR;
1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( NO_ERROR == ret ) {
1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Started AppCallbackNotifier..");
1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Couldn't start AppCallbackNotifier");
1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Enable the display adapter if present, actual overlay enable happens when we post the buffer
1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() != NULL)
1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Enabling display");
1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        bool isS3d = false;
1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        DisplayAdapter::S3DParameters s3dParams;
1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int width, height;
1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mParameters.getPreviewSize(&width, &height);
1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if 0 //TODO: s3d is not part of bringup...will reenable
1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_SUPPORTED)) != NULL) {
1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            isS3d = (strcmp(valstr, "true") == 0);
1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL) {
1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (strcmp(valstr, "off") == 0)
1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS OFF");
1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //TODO: obtain the frame packing configuration from camera or user settings
1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //once side by side configuration is supported
1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.mode = OVERLAY_S3D_MODE_ON;
1608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS ON");
1615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.mode = OVERLAY_S3D_MODE_OFF;
1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif //if 0
1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview, isS3d ? &s3dParams : NULL);
1626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->enableDisplay(width, height, NULL, isS3d ? &s3dParams : NULL);
1630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( ret != NO_ERROR )
1634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't enable display");
1636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto error;
1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Send START_PREVIEW command to adapter
1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Starting CameraAdapter preview mode");
1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW);
1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(ret!=NO_ERROR)
1647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter");
1649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Started preview");
1652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = true;
1654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStartInProgress = false;
1655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    error:
1658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Performing cleanup after error");
1660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Do all the cleanup
1662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        freePreviewBufs();
1663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
1664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayAdapter.get() != NULL)
1665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
16666b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng            mDisplayAdapter->disableDisplay(false);
1667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stop();
1669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewStartInProgress = false;
1670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewEnabled = false;
1671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Sets ANativeWindow object.
1678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it
1680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   to render buffers to display.
1681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] window The ANativeWindow object created by Surface flinger
1683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the ANativeWindow object passes validation criteria
1684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
1685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::setPreviewWindow(struct preview_stream_ops *window)
1688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
1691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = true;
1694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter
1696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!window)
1697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayAdapter.get() != NULL)
1699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///NULL window passed, destroy the display adapter if present
170141a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev            CAMHAL_LOGDA("NULL window passed, destroying display adapter");
1702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mDisplayAdapter.clear();
1703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client
1704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@remarks so, we will wait until it passes a valid window to begin the preview again
1705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSetPreviewWindowCalled = false;
1706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
170741a31123a0fc59b8112460285d3f1ba73c5537c0Emilian Peev        CAMHAL_LOGDA("NULL ANativeWindow passed to setPreviewWindow");
1708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
1709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }else if(mDisplayAdapter.get() == NULL)
1710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Need to create the display adapter since it has not been created
1712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Create display adapter
1713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter = new ANativeWindowDisplayAdapter();
1714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_ERROR;
1715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR))
1716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if(ret!=NO_ERROR)
1718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mDisplayAdapter.clear();
1720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("DisplayAdapter initialize failed");
1721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                LOG_FUNCTION_NAME_EXIT;
1722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return ret;
1723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
1725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("Couldn't create DisplayAdapter");
1727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                LOG_FUNCTION_NAME_EXIT;
1728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return NO_MEMORY;
1729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // DisplayAdapter needs to know where to get the CameraFrames from inorder to display
1733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter
1734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->setFrameProvider(mCameraAdapter);
1735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Any dynamic errors that happen during the camera use case has to be propagated back to the application
1737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
1738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Set it as the error handler for the DisplayAdapter
1739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get());
1740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Update the display adapter with the new window that is passed from CameraService
1742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret  = mDisplayAdapter->setPreviewWindow(window);
1743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(ret!=NO_ERROR)
1744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
1746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mPreviewStartInProgress)
1749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("setPreviewWindow called when preview running");
1751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            // Start the preview since the window is now available
1752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = startPreview();
1753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
175439371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu    } else {
175539371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu        // Update the display adapter with the new window that is passed from CameraService
175639371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu        ret = mDisplayAdapter->setPreviewWindow(window);
175739371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu        if ( (NO_ERROR == ret) && previewEnabled() ) {
175839371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu            restartPreview();
175939371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu        } else if (ret == ALREADY_EXISTS) {
176039371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu            // ALREADY_EXISTS should be treated as a noop in this case
176139371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu            ret = NO_ERROR;
176239371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu        }
1763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
1773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
1776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopPreview()
1779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1782150f3c891ce774b1546e90fab640ccb9c29ce536Akwasi Boateng    if( (!previewEnabled() && !mDisplayPaused) || mRecordingEnabled)
1783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
1786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17880e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman    bool imageCaptureRunning = (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE) &&
17890e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman                                    (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE);
17900e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman    if(mDisplayPaused && !imageCaptureRunning)
1791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Display is paused, which essentially means there is no preview active.
1793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Note: this is done so that when stopPreview is called by client after
1794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // an image capture, we do not de-initialize the camera adapter and
1795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // restart over again.
179697db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu
1797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
1798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    forceStopPreview();
1801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1802b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Reset Capture-Mode to default, so that when we switch from VideoRecording
1803b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE.
1804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Resetting Capture-Mode to default");
1805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
1806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if preview is enabled
1812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If preview is running currently
1815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If preview has been stopped
1816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::previewEnabled()
1819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return (mPreviewEnabled || mPreviewStartInProgress);
1823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start record mode.
1827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with
1829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  the corresponding frame. Every record frame must be released by calling
1830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  releaseRecordingFrame().
1831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If recording could be started without any issues
1834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update the header with possible error values in failure scenarios
1835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startRecording( )
1838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
1840b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
1841b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
1842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            gettimeofday(&mStartPreview, NULL);
1850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled())
1854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
18589743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // set internal recording hint in case camera adapter needs to make some
18599743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // decisions....(will only be sent to camera adapter if camera restart is required)
18609743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    mParameters.set(TICameraParameters::KEY_RECORDING_HINT, CameraParameters::TRUE);
18619743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
18629743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // if application starts recording in continuous focus picture mode...
18639743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // then we need to force default capture mode (as opposed to video mode)
18649743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    if ( ((valstr = mParameters.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) &&
18659743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu         (strcmp(valstr, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0) ){
18669743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        restartPreviewRequired = resetVideoModeParameters();
18679743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
18689743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
18699743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // only need to check recording hint if preview restart is not already needed
1870b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
18719743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    if ( !restartPreviewRequired &&
18729743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu         (!valstr || (valstr && (strcmp(valstr, CameraParameters::TRUE) != 0))) ) {
18738b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        restartPreviewRequired = setVideoModeParameters(mParameters);
18749743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
1875b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
18769743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    if (restartPreviewRequired) {
18779743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        ret = restartPreview();
18789743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
1879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
188172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      {
188272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
188372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        mParameters.getPreviewSize(&w, &h);
188472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGDB("%s Video Width=%d Height=%d", __FUNCTION__, mVideoWidth, mVideoHeight);
188572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
188672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if ((w != mVideoWidth) && (h != mVideoHeight))
188772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
188872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = allocVideoBufs(mVideoWidth, mVideoHeight, count);
188972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            if ( NO_ERROR != ret )
189072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              {
189172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
18929743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
189372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                return ret;
189472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              }
189572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
189672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->useVideoBuffers(true);
189772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->setVideoRes(mVideoWidth, mVideoHeight);
189872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, count, mVideoBufs);
189972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
190072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        else
190172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
190272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->useVideoBuffers(false);
190372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->setVideoRes(mPreviewWidth, mPreviewHeight);
190472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, count, NULL);
190572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
190672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
1907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret = mAppCallbackNotifier->startRecording();
1911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter
1916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret =  mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO);
1917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecordingEnabled = true;
1922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters specific to Video Recording.
1931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function checks for the camera parameters which have to be set for recording.
1933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it.
1934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function also enables Video Recording specific functions like VSTAB & VNF.
1935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1937b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Modify the policies for enabling VSTAB & VNF usecase based later.
1939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
19418b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luubool CameraHal::setVideoModeParameters(const CameraParameters& params)
1942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
1944a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev    const char *valstrRemote = NULL;
1945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool restartPreviewRequired = false;
1946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (valstr == NULL) ||
1953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) ) )
1954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE");
1956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE);
1957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        restartPreviewRequired = true;
1958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1960cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    // Check if CAPTURE_MODE is VIDEO_MODE, since VSTAB & VNF work only in VIDEO_MODE.
1961cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
19628b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    if (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0) {
1963a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev       valstrRemote = params.get(CameraParameters::KEY_VIDEO_STABILIZATION);
19648b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu       // set VSTAB. restart is required if vstab value has changed
1965a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev       if ( valstrRemote != NULL) {
19668b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            // make sure we support vstab
19678b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
19688b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                       CameraParameters::TRUE) == 0) {
19698b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                valstr = mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION);
19708b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                // vstab value has changed
19718b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                if ((valstr != NULL) &&
1972a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                     strcmp(valstr, valstrRemote) != 0) {
19738b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                    restartPreviewRequired = true;
19748b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                }
1975a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev                mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION, valstrRemote);
1976cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            }
19778b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        } else if (mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION)) {
19788b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            // vstab was configured but now unset
19798b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            restartPreviewRequired = true;
19808b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            mParameters.remove(CameraParameters::KEY_VIDEO_STABILIZATION);
19818b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        }
1982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19838b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        // Set VNF
1984a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        valstrRemote = params.get(TICameraParameters::KEY_VNF);
1985a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev        if ( valstrRemote == NULL) {
1986cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Enable VNF");
1987cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VNF, "1");
1988cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
19898b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        } else {
19908b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            valstr = mParameters.get(TICameraParameters::KEY_VNF);
1991a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            if (valstr && strcmp(valstr, valstrRemote) != 0) {
19928b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                restartPreviewRequired = true;
1993cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            }
1994a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev            mParameters.set(TICameraParameters::KEY_VNF, valstrRemote);
19958b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        }
1996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1997cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU.
1998cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048.
1999cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution.
20008b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        valstr = mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION);
20018b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        if (valstr && (strcmp(valstr, CameraParameters::TRUE) == 0) && (mPreviewWidth == 1920)) {
2002cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Force Enable VNF for 1080p");
2003cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VNF, "1");
2004cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
2005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
20068b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    }
2007b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
2008b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2009b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
2010b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
2011b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2012b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
2013b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Reset the camera parameters specific to Video Recording.
2014b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2015b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF.
2016b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2017b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
2018b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
2019b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2020b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
2021b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilbool CameraHal::resetVideoModeParameters()
2022b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
2023b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
2024b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
2025b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
2026b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2027b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
2028b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2029d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    // ignore this if we are already recording
2030d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    if (mRecordingEnabled) {
2031d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu        return false;
2032d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    }
2033d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu
2034b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
2035b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
20368b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    if ((valstr != NULL) && (strcmp(valstr, TICameraParameters::VIDEO_MODE) == 0)) {
2037b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Reset Capture-Mode to default");
2038b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
2039b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = true;
20408b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    }
2041b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2042b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
2043b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2044b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
2045b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
2046b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2047b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
2048b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Restart the preview with setParameter.
2049b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2050b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function restarts preview, for some VIDEO_MODE parameters to take effect.
2051b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2052b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
2053b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return NO_ERROR If recording parameters could be set without any issues
2054b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2055b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
2056b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilstatus_t CameraHal::restartPreview()
2057b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
2058b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
2059b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    char tmpvalstr[30];
2060b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
2061b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2062b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
2063b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2064b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview().
2065b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    tmpvalstr[0] = 0;
2066b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2067b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if(valstr != NULL)
2068b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        {
2069b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(sizeof(tmpvalstr) < (strlen(valstr)+1))
2070b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
2071b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            return -EINVAL;
2072b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
2073b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2074e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman        strncpy(tmpvalstr, valstr, sizeof(tmpvalstr));
2075b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        tmpvalstr[sizeof(tmpvalstr)-1] = 0;
2076b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        }
2077b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2078ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu    forceStopPreview();
2079b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2080b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    {
2081b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        Mutex::Autolock lock(mLock);
2082b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_CAP_MODE, tmpvalstr);
2083b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mCameraAdapter->setParameters(mParameters);
2084b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
2085b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2086b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    ret = startPreview();
2087b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started recording.
2095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopRecording()
2101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
21027d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    CameraAdapter::AdapterState currentState;
21037d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
21067d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    Mutex::Autolock lock(mLock);
21077d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!mRecordingEnabled )
2109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
2111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
21137d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    currentState = mCameraAdapter->getState();
21147d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) {
21157d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
21167d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    }
21177d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->stopRecording();
2119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO);
2121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
2123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
212472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if ( mAppCallbackNotifier->getUesVideoBuffers() ){
212572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      freeVideoBufs(mVideoBufs);
212672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      if (mVideoBufs){
212772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGVB(" FREEING mVideoBufs 0x%x", mVideoBufs);
212872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        delete [] mVideoBufs;
212972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
213072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      mVideoBufs = NULL;
213172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
213272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
21339743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // reset internal recording hint in case camera adapter needs to make some
21349743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // decisions....(will only be sent to camera adapter if camera restart is required)
21359743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
21369743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
2137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if recording is enabled.
2142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If recording is currently running
2145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If recording has been stopped
2146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::recordingEnabled()
2149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mRecordingEnabled;
2155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
2159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers
2161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               previously given by CameraHal
2162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::releaseRecordingFrame(const void* mem)
2166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //CAMHAL_LOGDB(" 0x%x", mem->pointer());
2170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( mRecordingEnabled ) && mem != NULL)
2172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->releaseRecordingFrame(mem);
2174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return;
2179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start auto focus
2183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This call asynchronous.
2185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   The notification callback routine is called with CAMERA_MSG_FOCUS once when
2186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focusing is complete. autoFocus() will be called again if another auto focus is
2187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   needed.
2188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
2191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes if the focus is not locked
2192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::autoFocus()
2195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&mStartFocus, NULL);
2201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
22062ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    Mutex::Autolock lock(mLock);
220778dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev
22082ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    mMsgEnabled |= CAMERA_MSG_FOCUS;
22092ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
221078dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    if ( NULL == mCameraAdapter )
221178dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        {
221278dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            ret = -1;
221378dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            goto EXIT;
221478dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        }
221578dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev
221678dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    CameraAdapter::AdapterState state;
221778dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    ret = mCameraAdapter->getState(state);
221878dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    if (ret != NO_ERROR)
221978dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        {
222078dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            goto EXIT;
222178dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        }
22222ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
222378dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev    if (state == CameraAdapter::AF_STATE)
2224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2225e46394481e771dbdc8683645c3740a3d262a3d0fIliyan Malchev            CAMHAL_LOGI("Ignoring start-AF (already in progress)");
222678dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev            goto EXIT;
222778dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev        }
2228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //pass the autoFocus timestamp along with the command to camera adapter
2232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus);
2233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS);
2237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
224078dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan MalchevEXIT:
2241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancels auto-focus function.
2248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   If the auto-focus is still in progress, this function will cancel it.
2250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Whether the auto-focus is in progress or not, this function will return the
2251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focus position to the default. If the camera does not support auto-focus, this is a no-op.
2252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the cancel succeeded
2256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if cancel didnt succeed
2257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelAutoFocus()
2260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
22622ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
22632ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    Mutex::Autolock lock(mLock);
2264fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    CameraParameters adapterParams = mParameters;
22652ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    mMsgEnabled &= ~CAMERA_MSG_FOCUS;
22662ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
2267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
2268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2269fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        adapterParams.set(TICameraParameters::KEY_AUTO_FOCUS_LOCK, CameraParameters::FALSE);
2270fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu        mCameraAdapter->setParameters(adapterParams);
2271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
22723ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman        mAppCallbackNotifier->flushEventQueue();
2273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2274fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu
2275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier)
2280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
2285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
2288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
2289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay);
2292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == mEventProvider )
2293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error in creating EventProvider");
2295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->enableEventNotification(eventMask);
2299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallbackRelay(CameraHalEvent* event)
2305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHal *appcbn = ( CameraHal * ) (event->mCookie);
2309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    appcbn->eventCallback(event );
2310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallback(CameraHalEvent* event)
2315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != event )
2319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch( event->mEventType )
2321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CameraHalEvent::EVENT_FOCUS_LOCKED:
2323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CameraHalEvent::EVENT_FOCUS_ERROR:
2324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( mBracketingEnabled )
2326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
2327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    startImageBracketing();
2328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
2329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
2332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
2336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startImageBracketing()
2342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        status_t ret = NO_ERROR;
2344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraFrame frame;
2345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraAdapter::BuffersDescriptor desc;
2346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartCapture, NULL);
2350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
2354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!previewEnabled() && !mDisplayPaused)
2356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            LOG_FUNCTION_NAME_EXIT;
2358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
2359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( !mBracketingEnabled )
2362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
2364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingRunning = true;
2369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &frame,
2375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( mBracketRangeNegative + 1 ));
2376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != mAppCallbackNotifier.get() )
2386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
2388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mParameters.getPictureSize(( int * ) &frame.mWidth,
2394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                       ( int * ) &frame.mHeight);
2395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = allocImageBufs(frame.mWidth,
2397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mHeight,
2398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mLength,
2399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mParameters.getPictureFormat(),
2400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 ( mBracketRangeNegative + 1 ));
2401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
240272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              {
2403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
240472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              }
2405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mImageBufs;
2411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
2412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
2413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
2414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 );
2415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = ( size_t ) ( mBracketRangeNegative + 1 );
2416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
2419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
2421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 //pass capture timestamp along with the camera adapter command
2426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE,  ( mBracketRangePositive + 1 ),  (int) &mStartCapture);
2427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ));
2431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
2438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::stopImageBracketing()
2441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        status_t ret = NO_ERROR;
2443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
2445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
244688006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        if( !previewEnabled() )
2447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
2449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
245188006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        mBracketingRunning = false;
245288006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman
245388006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE);
2454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
2458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Take a picture.
2462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If able to switch to image capture
2465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if unable to switch to image capture
2466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::takePicture( )
2469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
2472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
2473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int burst;
2474ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    const char *valstr = NULL;
2475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int bufferCount = 1;
2476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&mStartCapture, NULL);
2482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled() && !mDisplayPaused)
2488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2490ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Preview not started...");
2491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
2492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2494ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // return error if we are already capturing
2495ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE &&
2496ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu          mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) ||
2497ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE &&
2498ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu          mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE) ) {
2499ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Already capturing an image...");
2500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
2501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2503ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // we only support video snapshot if we are in video mode (recording hint is set)
2504ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2505ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) &&
2506ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (valstr && strcmp(valstr, TICameraParameters::VIDEO_MODE)) ) {
2507ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Trying to capture while recording without recording hint set...");
2508ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        return INVALID_OPERATION;
2509ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
2510ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( !mBracketingRunning )
2512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if ( NO_ERROR == ret )
2515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            burst = mParameters.getInt(TICameraParameters::KEY_BURST);
2517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //Allocate all buffers only in burst capture case
2520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if ( burst > 1 )
2521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
2522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             bufferCount = CameraHal::NO_BUFFERS_IMAGE_CAPTURE;
2523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( NULL != mAppCallbackNotifier.get() )
2524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
2526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
2528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         else
2529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
2530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( NULL != mAppCallbackNotifier.get() )
2531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(false);
2533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
2535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2536ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // pause preview during normal image capture
2537ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // do not pause preview if recording (video state)
2538ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if (NO_ERROR == ret &&
2539ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                NULL != mDisplayAdapter.get() &&
2540ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                burst < 1) {
2541ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) {
2542ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mDisplayPaused = true;
2543ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mPreviewEnabled = false;
2544ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
2545ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                // since preview is paused we should stop sending preview frames too
2546ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
2547ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME);
2548ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                }
2549ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            }
2550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mDisplayAdapter->setSnapshotTimeRef(&mStartCapture);
2553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2554ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        }
2555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2556c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        // if we taking video snapshot...
2557c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        if ((NO_ERROR == ret) && (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE)) {
2558c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            // enable post view frames if not already enabled so we can internally
2559c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            // save snapshot frames for generating thumbnail
2560c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            if((mMsgEnabled & CAMERA_MSG_POSTVIEW_FRAME) == 0) {
2561c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu                mAppCallbackNotifier->enableMsgType(CAMERA_MSG_POSTVIEW_FRAME);
2562c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            }
2563c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        }
2564c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu
2565ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) )
2566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
2568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  ( int ) &frame,
2570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  bufferCount);
2571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mParameters.getPictureSize(( int * ) &frame.mWidth,
2581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                       ( int * ) &frame.mHeight);
2582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = allocImageBufs(frame.mWidth,
2584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mHeight,
2585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mLength,
2586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mParameters.getPictureFormat(),
2587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 bufferCount);
2588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
2591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mImageBufs;
2597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
2598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
2599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
2600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) bufferCount;
2601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = ( size_t ) bufferCount;
2602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
2605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( NULL != mCameraAdapter ) )
2609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //pass capture timestamp along with the camera adapter command
2614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,  (int) &mStartCapture);
2615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
2619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancel a picture that was started with takePicture.
2629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Calling this method when no picture is being taken is a no-op.
2631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent
2634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
2635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelPicture( )
2638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
2644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Return the camera parameters.
2650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return Currently configured camera parameters
2653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar* CameraHal::getParameters()
2656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    String8 params_str8;
2658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char* params_string;
265972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    const char * valstr = NULL;
2660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
2664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2665f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        mCameraAdapter->getParameters(mParameters);
2666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
266872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    CameraParameters mParams = mParameters;
266972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
267072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
267172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
267272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if(valstr != NULL)
267372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      {
267472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if(strcmp(valstr, CameraParameters::TRUE) == 0)
267572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
267672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            //HACK FOR MMS MODE
267772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            resetPreviewRes(&mParams, mVideoWidth, mVideoHeight);
267872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
267972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
2680524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
26819743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // do not send internal parameters to upper layers
26829743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    mParams.remove(TICameraParameters::KEY_RECORDING_HINT);
2683fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu    mParams.remove(TICameraParameters::KEY_AUTO_FOCUS_LOCK);
26849743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
268572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    params_str8 = mParams.flatten();
2686524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
2687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // camera service frees this string...
2688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params_string = (char*) malloc(sizeof(char) * (params_str8.length()+1));
2689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    strcpy(params_string, params_str8.string());
2690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Return the current set of parameters
2694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return params_string;
2696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::putParameters(char *parms)
2699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    free(parms);
2701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Send command to camera driver.
2705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the command succeeds
2708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes that this function can return
2709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
2712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) )
2719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("No CameraAdapter instance");
2721057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        return -EINVAL;
2722057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        }
2723057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu
2724057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
2725057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    // Following commands do NOT need preview to be started
2726057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
2727057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    switch(cmd) {
2728057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG:
2729057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            bool enable = static_cast<bool>(arg1);
2730057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            Mutex::Autolock lock(mLock);
2731057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            if (enable) {
2732057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu                mMsgEnabled |= CAMERA_MSG_FOCUS_MOVE;
2733057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            } else {
2734057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu                mMsgEnabled &= ~CAMERA_MSG_FOCUS_MOVE;
2735057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            }
2736057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu            return NO_ERROR;
2737057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu        break;
2738057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    }
2739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( !previewEnabled() ))
2741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Preview is not running");
2743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
2744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2746057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
2747057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    // Following commands NEED preview to be started
2748057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu    ///////////////////////////////////////////////////////
2749057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu
2750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
2751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch(cmd)
2753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_SMOOTH_ZOOM:
2755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1);
2757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_SMOOTH_ZOOM:
2760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM);
2762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_FACE_DETECTION:
2764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD);
2766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_FACE_DETECTION:
2770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
2772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
2776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
2778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release the hardware resources owned by this object.
2787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Note that this is *not* done in the destructor.
2789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::release()
2795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@todo Investigate on how release is used by CameraService. Vaguely remember that this is called
2798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///just before CameraHal object destruction
2799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
2800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Dump state of the camera hardware
2806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] fd    File descriptor
2808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] args  Arguments
2809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Dump succeeded
2810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo  Error codes for dump fail
2811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t  CameraHal::dump(int fd) const
2814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Implement this method when the h/w dump function is supported on Ducati side
2817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Interface Method definitions ENDS here--------------------*/
2821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Internal Method definitions STARTS here--------------------*/
2826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Constructor of CameraHal
2829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Member variables are initialized here.  No allocations should be done here as we
2831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   don't use c++ exceptions in the code.
2832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::CameraHal(int cameraId)
2835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize all the member variables to their defaults
2839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
2840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewBufs = NULL;
2841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageBufs = NULL;
2842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBufProvider = NULL;
2843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStartInProgress = false;
2844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBufs = NULL;
2845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBufProvider = NULL;
2846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
2847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
2848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
2849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMsgEnabled = 0;
2850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier = NULL;
2851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMemoryManager = NULL;
2852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter = NULL;
2853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingEnabled = false;
2854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingRunning = false;
2855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = NULL;
2856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangePositive = 1;
2857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangeNegative = 1;
2858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = 0;
2859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mShutterEnabled = true;
2860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMeasurementEnabled = false;
2861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataBufs = NULL;
2862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = NULL;
2863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCurrentTime = 0;
2864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mFalsePreview = 0;
2865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageOffsets = NULL;
2866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageLength = 0;
2867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageFd = 0;
2868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoOffsets = NULL;
2869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoFd = 0;
2870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoLength = 0;
2871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataOffsets = NULL;
2872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataFd = 0;
2873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataLength = 0;
2874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewFd = 0;
2875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewWidth = 0;
2876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewHeight = 0;
2877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewLength = 0;
2878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewOffsets = NULL;
2879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewRunning = 0;
2880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStateOld = 0;
2881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = 0;
2882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordEnabled = 0;
2883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = NULL;
288472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoWidth = 0;
288572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoHeight = 0;
2886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Initialize the CameraHAL constructor timestamp, which is used in the
2890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // PPM() method as time reference if the user does not supply one.
2891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&ppm_start, NULL);
2892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraIndex = cameraId;
2896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Destructor of CameraHal
2902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function simply calls deinitialize() to free up memory allocate during construct
2904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   phase
2905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::~CameraHal()
2907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Call de-initialize here once more - it is the last chance for us to relinquish all the h/w and s/w resources
2911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
2912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
2914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
2917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
2918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the callback notifier
2921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier.clear();
2922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the display adapter
2924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayAdapter.clear();
2925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
2927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int strongCount = mCameraAdapter->getStrongCount();
2928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->decStrong(mCameraAdapter);
2930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
2932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2934de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    freeImageBufs();
2935de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
2936de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    /// Free the memory manager
2937de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    mMemoryManager.clear();
2938de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
2939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Initialize the Camera HAL
2944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Creates CameraAdapter, AppCallbackNotifier, DisplayAdapter and MemoryManager
2946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param None
2948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR - On success
2949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         NO_MEMORY - On failure to allocate memory for any of the objects
2950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @remarks Camera Hal internal function
2951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::initialize(CameraProperties::Properties* properties)
2955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int sensor_index = 0;
2959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize the event mask used for registering an event provider for AppCallbackNotifier
2961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Currently, registering all events as to be coming from CameraAdapter
2962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int32_t eventMask = CameraHalEvent::ALL_EVENTS;
2963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Get my camera properties
2965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = properties;
2966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mCameraProperties)
2968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Dump the properties of this Camera
2973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // will only print if DEBUG macro is defined
2974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties->dump();
2975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)) != 0 )
2977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        sensor_index = atoi(mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX));
2979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Sensor index %d", sensor_index);
2982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
29839a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu    mCameraAdapter = CameraAdapter_Factory(sensor_index);
29849a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu    if ( ( NULL == mCameraAdapter ) || (mCameraAdapter->initialize(properties)!=NO_ERROR))
2985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Unable to create or initialize CameraAdapter");
2987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
2988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->incStrong(mCameraAdapter);
2992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerImageReleaseCallback(releaseImageBuffers, (void *) this);
2993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerEndCaptureCallback(endImageCapture, (void *)this);
2994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mAppCallbackNotifier.get())
2996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create the callback notifier
2998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier = new AppCallbackNotifier();
2999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mAppCallbackNotifier.get() ) || ( mAppCallbackNotifier->initialize() != NO_ERROR))
3000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize AppCallbackNotifier");
3002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
3003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mMemoryManager.get())
3007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create Memory Manager
3009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mMemoryManager = new MemoryManager();
3010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mMemoryManager.get() ) || ( mMemoryManager->initialize() != NO_ERROR))
3011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize MemoryManager");
3013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
3014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Setup the class dependencies...
3018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///AppCallbackNotifier has to know where to get the Camera frames and the events like auto focus lock etc from.
3020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///CameraAdapter is the one which provides those events
3021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the frame and event providers for AppCallbackNotifier
3022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@remarks  setEventProvider API takes in a bit mask of events for registering a provider for the different events
3023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         That way, if events can come from DisplayAdapter in future, we will be able to add it as provider
3024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         for any event
3025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setEventProvider(eventMask, mCameraAdapter);
3026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setFrameProvider(mCameraAdapter);
3027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Any dynamic errors that happen during the camera use case has to be propagated back to the application
3029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
3030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the error handler for CameraAdapter
3031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->setErrorHandler(mAppCallbackNotifier.get());
3032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
3034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier->start() != NO_ERROR)
3035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      {
3036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't start AppCallbackNotifier");
3037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
3038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      }
3039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Started AppCallbackNotifier..");
3041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
3042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize default parameters
3044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    initDefaultParameters();
3045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( setParameters(mParameters) != NO_ERROR )
3048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Failed to set default parameters?!");
3050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // register for sensor events
3053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = new SensorListener();
3054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
3055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (mSensorListener->initialize() == NO_ERROR) {
3056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->setCallbacks(orientation_cb, this);
3057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->enableSensor(SensorListener::SENSOR_ORIENTATION);
3058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        } else {
3059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Error initializing SensorListener. not fatal, continuing");
3060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener.clear();
3061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener = NULL;
3062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
3068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fail_loop:
3070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Free up the resources because we failed somewhere up
3072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        deinitialize();
3073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
3074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
3076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions)
3080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
3082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status = NO_ERROR;
3083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
3085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedResolutions )
3089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported resolutions string");
3091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status = snprintf(tmpBuffer, PARAM_BUFFER, "%dx%d", width, height);
3096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 > status )
3097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
3099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedResolutions, tmpBuffer);
3104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(const char *param, const char *supportedParams)
3121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
3123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
3124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedParams )
3128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
3130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == param )
3135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid parameter string");
3137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedParams, param);
3142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(int param, const char *supportedParams)
3159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
3161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
3162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status;
3163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedParams )
3168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
3170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status = snprintf(tmpBuffer, PARAM_BUFFER, "%d", param);
3175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 > status )
3176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
3178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedParams, tmpBuffer);
3183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3199f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luustatus_t CameraHal::doesSetParameterNeedUpdate(const char* new_param, const char* old_param, bool& update) {
3200f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if (!new_param || !old_param) {
3201f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        return -EINVAL;
3202f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
3203f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3204f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    // if params mismatch we should update parameters for camera adapter
3205f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if ((strcmp(new_param, old_param) != 0)) {
3206f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu       update = true;
3207f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
3208f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3209f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu   return NO_ERROR;
3210f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu}
3211f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::parseResolution(const char *resStr, int &width, int &height)
3213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
3215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *ctx, *pWidth, *pHeight;
3216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *sep = "x";
3217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *tmp = NULL;
3218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == resStr )
3222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
3224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //This fixes "Invalid input resolution"
3227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *resStr_copy = (char *)malloc(strlen(resStr) + 1);
3228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL!=resStr_copy ) {
3229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        strcpy(resStr_copy, resStr);
3232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pWidth = strtok_r( (char *) resStr_copy, sep, &ctx);
3233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pWidth )
3235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            width = atoi(pWidth);
3237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
3239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
3242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pHeight = strtok_r(NULL, sep, &ctx);
3248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pHeight )
3250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            height = atoi(pHeight);
3252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
3254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
3257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        free(resStr_copy);
3261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        resStr_copy = NULL;
3262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     }
3263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::insertSupportedParams()
3269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters &p = mParameters;
3275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set the name of the camera
3277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CAMERA_NAME, mCameraProperties->get(CameraProperties::CAMERA_NAME));
3278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = atoi(mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES));
3282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS));
3283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES));
3284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
3285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
3286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_THUMBNAIL_SIZES));
3287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE));
3288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_EFFECTS, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS));
3289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES));
3291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES));
3292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING));
3293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MAX));
3294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MIN));
3295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_EV_STEP));
3296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES));
3298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_ISO_VALUES, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES));
3299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM_RATIOS, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_RATIOS));
3300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_ZOOM, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::ZOOM_SUPPORTED));
3302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::SMOOTH_ZOOM_SUPPORTED));
3303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_IPP, mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES));
3304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D_SUPPORTED,mCameraProperties->get(CameraProperties::S3D_SUPPORTED));
3305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D2D_PREVIEW_MODE,mCameraProperties->get(CameraProperties::S3D2D_PREVIEW_MODES));
3306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE));
3307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
33088b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    p.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED));
3309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
3310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED));
3313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED));
33149919dafce4d57f0b9b9aedafc95b756464685009Tyler Luu    p.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, mCameraProperties->get(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED));
3315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::initDefaultParameters()
3321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Purpose of this function is to initialize the default current and supported parameters for the currently
3323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //selected camera.
3324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters &p = mParameters;
3326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentRevision, adapterRevision;
3327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
3328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int width, height;
3329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PREVIEW_SIZE), width, height);
3333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(width, height);
3337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT);
3341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PICTURE_SIZE), width, height);
3344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(width, height);
3348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(PICTURE_WIDTH, PICTURE_HEIGHT);
3352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_SIZE), width, height);
3355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width);
3359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height);
3360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, MIN_WIDTH);
3364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, MIN_HEIGHT);
3365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    insertSupportedParams();
3368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Insert default values
3370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFrameRate(atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)));
3371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFormat(mCameraProperties->get(CameraProperties::PREVIEW_FORMAT));
3372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPictureFormat(mCameraProperties->get(CameraProperties::PICTURE_FORMAT));
3373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_JPEG_QUALITY, mCameraProperties->get(CameraProperties::JPEG_QUALITY));
3374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_WHITE_BALANCE, mCameraProperties->get(CameraProperties::WHITEBALANCE));
3375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EFFECT,  mCameraProperties->get(CameraProperties::EFFECT));
3376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ANTIBANDING, mCameraProperties->get(CameraProperties::ANTIBANDING));
3377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FOCUS_MODE, mCameraProperties->get(CameraProperties::FOCUS_MODE));
3379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::EV_COMPENSATION));
3380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SCENE_MODE, mCameraProperties->get(CameraProperties::SCENE_MODE));
3381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM, mCameraProperties->get(CameraProperties::ZOOM));
3383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CONTRAST, mCameraProperties->get(CameraProperties::CONTRAST));
3384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SATURATION, mCameraProperties->get(CameraProperties::SATURATION));
3385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_BRIGHTNESS, mCameraProperties->get(CameraProperties::BRIGHTNESS));
3386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SHARPNESS, mCameraProperties->get(CameraProperties::SHARPNESS));
3387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXPOSURE_MODE, mCameraProperties->get(CameraProperties::EXPOSURE_MODE));
3388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_ISO, mCameraProperties->get(CameraProperties::ISO_MODE));
3389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_IPP, mCameraProperties->get(CameraProperties::IPP));
3390d054c26243e4cf49e5fe04789e4437e5e0f3f574Sundar Raman    p.set(TICameraParameters::KEY_GBCE, mCameraProperties->get(CameraProperties::GBCE));
3391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D2D_PREVIEW, mCameraProperties->get(CameraProperties::S3D2D_PREVIEW));
3392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_AUTOCONVERGENCE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE));
3393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
33948b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    p.set(CameraParameters::KEY_VIDEO_STABILIZATION, mCameraProperties->get(CameraProperties::VSTAB));
3395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FOCAL_LENGTH, mCameraProperties->get(CameraProperties::FOCAL_LENGTH));
3396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::HOR_ANGLE));
3397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::VER_ANGLE));
3398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
3399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MAKE, mCameraProperties->get(CameraProperties::EXIF_MAKE));
3402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MODEL, mCameraProperties->get(CameraProperties::EXIF_MODEL));
3403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_QUALITY));
3404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, "OMX_TI_COLOR_FormatYUV420PackedSemiPlanar");
3405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, mCameraProperties->get(CameraProperties::MAX_FD_HW_FACES));
3406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, mCameraProperties->get(CameraProperties::MAX_FD_SW_FACES));
3407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Only one area a.k.a Touch AF for now.
3409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // TODO: Add support for multiple focus areas.
3410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, mCameraProperties->get(CameraProperties::MAX_FOCUS_AREAS));
3411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK));
3412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK));
3413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, mCameraProperties->get(CameraProperties::MAX_NUM_METERING_AREAS));
3414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
3420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
3422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::forceStopPreview()
3425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // stop bracketing if it is running
3429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    stopImageBracketing();
3430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() != NULL) {
3432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Stop the buffer display first
3433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->disableDisplay();
3434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier.get() != NULL) {
3437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Stop the callback sending
3438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stop();
343926d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu        mAppCallbackNotifier->flushAndReturnFrames();
3440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stopPreviewCallbacks();
3441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
3444342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // only need to send these control commands to state machine if we are
3445342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // passed the LOADED_PREVIEW_STATE
3446a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        if (mCameraAdapter->getState() > CameraAdapter::LOADED_PREVIEW_STATE) {
3447342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // according to javadoc...FD should be stopped in stopPreview
3448342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // and application needs to call startFaceDection again
3449342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // to restart FD
3450342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
3451342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
3452342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu
3453a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu        mCameraAdapter->rollbackToInitializedState();
3454a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu
3455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewBufs();
3458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewDataBufs();
3459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
3461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
3462342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu    mPreviewStartInProgress = false;
3463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Deallocates memory for all the resources held by Camera HAL.
3469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter,
3471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   and Memory Manager
3472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
3475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::deinitialize()
3478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3481f5094850dd99854af026e16bd21d8555a5168afbSundar Raman    if ( mPreviewEnabled || mDisplayPaused ) {
3482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        forceStopPreview();
3483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
3486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
3488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION);
3489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener.clear();
3490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener = NULL;
3491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::storeMetaDataInBuffers(bool enable)
3498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mAppCallbackNotifier->useMetaDataBufferMode(enable);
3502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3506a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boatengvoid CameraHal::selectFPSRange(int framerate, int *min_fps, int *max_fps)
3507a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng{
3508a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  char * ptr;
3509a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  char supported[MAX_PROP_VALUE_LENGTH];
3510a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  int fpsrangeArray[2];
3511a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  int i = 0;
3512a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3513a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  LOG_FUNCTION_NAME;
3514a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  size_t size = strlen(mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))+1;
3515a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  strncpy(supported, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED), size);
3516a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3517a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  ptr = strtok (supported," (,)");
3518a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3519a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  while (ptr != NULL)
3520a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng    {
3521a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      fpsrangeArray[i]= atoi(ptr)/CameraHal::VFR_SCALE;
3522a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      if (i == 1)
3523a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng        {
3524a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          if (framerate == fpsrangeArray[i])
3525a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng            {
3526a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              CAMHAL_LOGDB("SETTING FPS RANGE min = %d max = %d \n", fpsrangeArray[0], fpsrangeArray[1]);
3527d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman              *min_fps = fpsrangeArray[0]*CameraHal::VFR_SCALE;
3528d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman              *max_fps = fpsrangeArray[1]*CameraHal::VFR_SCALE;
3529a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              break;
3530a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng            }
3531a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng        }
3532a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      ptr = strtok (NULL, " (,)");
3533a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      i++;
3534a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      i%=2;
3535a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng    }
3536a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3537a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
3538a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3539a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng}
3540a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
354172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengvoid CameraHal::setPreferredPreviewRes(int width, int height)
354272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
354372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
354472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
354572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width == 320) && (height == 240)){
354672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParameters.setPreviewSize(640,480);
354772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
354872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width == 176) && (height == 144)){
354972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParameters.setPreviewSize(704,576);
355072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
355172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
355272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
355372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
355472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
355572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengvoid CameraHal::resetPreviewRes(CameraParameters *mParams, int width, int height)
355672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
355772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
355872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
355972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width <= 320) && (height <= 240)){
356072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParams->setPreviewSize(mVideoWidth, mVideoHeight);
356172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
356272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
356372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
356472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
356572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
3566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
3567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3569