CameraHal.cpp revision 9743353b9dd1da8d1755218a7b961400ce825bd1
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
1342ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    if (msgType & CAMERA_MSG_FOCUS) {
1352ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu        msgType &= ~CAMERA_MSG_FOCUS;
1362ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    }
1372ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMsgEnabled |= msgType;
141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayPaused)
146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Preview currently paused...will enable preview callback when restarted");
148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            msgType &= ~CAMERA_MSG_PREVIEW_FRAME;
149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }else
150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("Enabling Preview Callback");
152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Preview callback not enabled %x", msgType);
157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Configure app callback notifier with the message callback required
161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->enableMsgType (msgType);
162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Disable a message, or set of messages.
168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] msgtype Bitmask of the messages to disable (defined in include/ui/Camera.h)
170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::disableMsgType(int32_t msgType)
174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        Mutex::Autolock lock(mLock);
179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mMsgEnabled &= ~msgType;
180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( msgType & CAMERA_MSG_PREVIEW_FRAME)
183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Disabling Preview Callback");
185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Configure app callback notifier
188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->disableMsgType (msgType);
189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Query whether a message, or a set of messages, is enabled.
195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Note that this is operates as an AND, if any of the messages queried are off, this will
197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   return false.
198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] msgtype Bitmask of the messages to query (defined in include/ui/Camera.h)
200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If all message types are enabled
201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          false If any message type
202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::msgTypeEnabled(int32_t msgType)
205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return (mMsgEnabled & msgType);
210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters.
214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] params Camera parameters to configure the camera
216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::setParameters(const char* parameters)
221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   LOG_FUNCTION_NAME;
224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters params;
226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    String8 str_params(parameters);
228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params.unflatten(str_params);
229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return setParameters(params);
233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters.
237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] params Camera parameters to configure the camera
239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::setParameters(const CameraParameters& params)
244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   LOG_FUNCTION_NAME;
247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w_orig, h_orig;
250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int framerate,minframerate;
251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int maxFPS, minFPS;
252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int error;
253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int base;
254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *prevFormat;
256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *af_coord;
257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    TIUTILS::Message msg;
258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
259b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Needed for KEY_RECORDING_HINT
260b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
261f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    bool updateRequired = false;
262b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    CameraParameters oldParams(mParameters.flatten());
263381ec2390c3d9d6ba3b67cf53e69fec96e7a7bd1Akwasi Boateng    bool videoMode = false;
264524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman    char range[MAX_PROP_VALUE_LENGTH];
265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
266b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    {
267b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        Mutex::Autolock lock(mLock);
268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
269b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Ensure that preview is not enabled when the below parameters are changed.
270b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(!previewEnabled())
271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
273b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("PreviewFormat %s", params.getPreviewFormat());
274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2753a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ((valstr = params.getPreviewFormat()) != NULL) {
2763a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS))) {
2773a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    mParameters.setPreviewFormat(valstr);
2783a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                } else {
2793a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    CAMHAL_LOGEB("Invalid preview format.Supported: %s",  mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
2803a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                    return -EINVAL;
281b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
2823a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
283b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
284f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((valstr = params.get(TICameraParameters::KEY_VNF)) != NULL) {
285f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                if ( (params.getInt(TICameraParameters::KEY_VNF)==0) || (params.getInt(TICameraParameters::KEY_VNF)==1) ) {
286f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGDB("VNF set %s", params.get(TICameraParameters::KEY_VNF));
287f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    mParameters.set(TICameraParameters::KEY_VNF, valstr);
288f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                } else {
289f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid VNF: %s", valstr);
290f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    ret = -EINVAL;
291b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
292f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
293b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2948b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            if ((valstr = params.get(CameraParameters::KEY_VIDEO_STABILIZATION)) != NULL) {
2958b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                // make sure we support vstab...if we don't and application is trying to set
2968b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                // vstab then return an error
2978b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
2988b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                           CameraParameters::TRUE) == 0) {
2998b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                    CAMHAL_LOGDB("VSTAB %s",
3008b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                                  params.get(CameraParameters::KEY_VIDEO_STABILIZATION));
3018b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                    mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION,
3028b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                                    params.get(CameraParameters::KEY_VIDEO_STABILIZATION));
3038b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                } else if (strcmp(valstr, CameraParameters::TRUE) == 0) {
304f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid VSTAB: %s", valstr);
305f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    ret = -EINVAL;
3068b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                } else {
3078b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                    mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION,
3088b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                                    CameraParameters::FALSE);
309b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
310f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
311b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
312b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL)
313b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
314b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Capture mode set %s", params.get(TICameraParameters::KEY_CAP_MODE));
315b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_CAP_MODE, valstr);
316b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
317b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
318f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((valstr = params.get(TICameraParameters::KEY_IPP)) != NULL) {
319f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES))) {
320f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGDB("IPP mode set %s", params.get(TICameraParameters::KEY_IPP));
321f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    mParameters.set(TICameraParameters::KEY_IPP, valstr);
322f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                } else {
323f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    CAMHAL_LOGEB("ERROR: Invalid IPP mode: %s", valstr);
324f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                    ret = -EINVAL;
325b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
326f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
327b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
328b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if((valstr = params.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL)
329b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
330b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Stereo 3D->2D Preview mode is %s", params.get(TICameraParameters::KEY_S3D2D_PREVIEW));
331b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_S3D2D_PREVIEW, valstr);
332b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
333b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
334b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if((valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL)
335b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
336b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("AutoConvergence mode is %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE));
337b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr);
338b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
339b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
340b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
341b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
3423a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu        //CTS requirement, we should be able to change the preview resolution
3433a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu        //while in paused display state
3443a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu        if ( !previewEnabled() || mDisplayPaused )
3453a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            {
3463a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            params.getPreviewSize(&w, &h);
3473a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if (w == -1 && h == -1) {
3483a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEA("Unable to get preview size");
3493a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                return -EINVAL;
3503a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              }
3513a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3523a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            int oldWidth, oldHeight;
3533a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            mParameters.getPreviewSize(&oldWidth, &oldHeight);
3543a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3553a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            int orientation =0;
3563a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if((valstr = params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)) != NULL)
3573a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3583a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGDB("Sensor Orientation is set to %s", params.get(TICameraParameters::KEY_SENSOR_ORIENTATION));
3593a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.set(TICameraParameters::KEY_SENSOR_ORIENTATION, valstr);
3603a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                orientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION);
3613a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3623a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3633a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if(orientation ==90 || orientation ==270)
3643a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           {
3653a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              if ( !isResolutionValid(h,w, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
3663a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               {
3673a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
3683a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                return -EINVAL;
3693a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               }
3703a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              else
3713a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu              {
3723a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.setPreviewSize(w, h);
37372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoWidth = w;
37472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoHeight = h;
3753a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu               }
3763a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           }
3773a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           else
3783a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           {
3793a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ( !isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)))
3803a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3813a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h);
3823a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                return -EINVAL;
3833a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3843a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            else
3853a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
3863a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                mParameters.setPreviewSize(w, h);
3873a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3883a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu           }
3893a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3903a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            if ( ( oldWidth != w ) || ( oldHeight != h ) )
3913a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                {
392ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu                restartPreviewRequired |= true;
3933a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu                }
3943a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
3953a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            CAMHAL_LOGDB("PreviewResolution by App %d x %d", w, h);
3963a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu            }
3973a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu
398b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
399b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        valstr = params.get(CameraParameters::KEY_RECORDING_HINT);
400b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(valstr != NULL)
401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
402b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if(strcmp(valstr, CameraParameters::TRUE) == 0)
403b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
404b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
405b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
406ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu                restartPreviewRequired |= setVideoModeParameters(params);
407381ec2390c3d9d6ba3b67cf53e69fec96e7a7bd1Akwasi Boateng                videoMode = true;
40872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                int w, h;
40972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
41072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                params.getPreviewSize(&w, &h);
41172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Preview Width=%d Height=%d\n", __FUNCTION__, w, h);
41272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                //HACK FOR MMS
41372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoWidth = w;
41472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mVideoHeight = h;
41572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Video Width=%d Height=%d\n", __FUNCTION__, mVideoWidth, mVideoHeight);
41672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
41772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                setPreferredPreviewRes(w, h);
41872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                mParameters.getPreviewSize(&w, &h);
41972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGVB("%s Preview Width=%d Height=%d\n", __FUNCTION__, w, h);
42072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
421b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
422b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else if(strcmp(valstr, CameraParameters::FALSE) == 0)
423b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
424b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDB("Recording Hint is set to %s", valstr);
425b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.set(CameraParameters::KEY_RECORDING_HINT, valstr);
426ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu                restartPreviewRequired |= resetVideoModeParameters();
42772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                params.getPreviewSize(&mVideoWidth, &mVideoHeight);
428b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
429b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
430b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
431b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGEA("Invalid RECORDING_HINT");
432b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                return -EINVAL;
433b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
437b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // This check is required in following case.
438b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // If VideoRecording activity sets KEY_RECORDING_HINT to TRUE and
439b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // ImageCapture activity doesnot set KEY_RECORDING_HINT to FALSE (i.e. simply NULL),
440b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            // then Video Mode parameters may remain present in ImageCapture activity as well.
441b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Recording Hint is set to NULL");
442b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_RECORDING_HINT, "");
443ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu            restartPreviewRequired |= resetVideoModeParameters();
44472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            params.getPreviewSize(&mVideoWidth, &mVideoHeight);
445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
4479743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) {
4489743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) {
4499743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                CAMHAL_LOGDB("Focus mode set %s", params.get(CameraParameters::KEY_FOCUS_MODE));
4509743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
4519743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                // we need to take a decision on the capture mode based on whether CAF picture or
4529743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                // video is chosen so the behavior of each is consistent to the application
4539743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                if(strcmp(valstr, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0){
4549743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                    restartPreviewRequired |= resetVideoModeParameters();
4559743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                } else if (strcmp(valstr, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) == 0){
4569743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                    restartPreviewRequired |= setVideoModeParameters(params);
4579743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                }
4589743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
4599743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                mParameters.set(CameraParameters::KEY_FOCUS_MODE, valstr);
4609743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu             } else {
4619743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr);
4629743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                ret = -EINVAL;
4639743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu             }
4649743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        }
4659743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
466b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Below parameters can be changed when the preview is running
467f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ( (valstr = params.getPictureFormat()) != NULL ) {
468f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(params.getPictureFormat(),mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) {
469f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.setPictureFormat(valstr);
470f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
471f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr);
472f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
476b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        params.getPictureSize(&w, &h);
477f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ( isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES))) {
478b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.setPictureSize(w, h);
479f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        } else {
480f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            CAMHAL_LOGEB("ERROR: Invalid picture resolution %dx%d", w, h);
481f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            ret = -EINVAL;
482f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
484b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Picture Size by App %d x %d", w, h);
485b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
486f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) {
487f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BURST) >=0) {
488f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Burst set %s", params.get(TICameraParameters::KEY_BURST));
489f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BURST, valstr);
490f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
491f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr);
492f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
494f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
496b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        framerate = params.getPreviewFrameRate();
497524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        valstr = params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
498b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("FRAMERATE %d", framerate);
499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
500524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGVB("Passed FRR: %s, Supported FRR %s", valstr
501524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
502524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGVB("Passed FR: %d, Supported FR %s", framerate
503524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
504524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
505524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
506524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        //Perform parameter validation
507524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if(!isParameterValid(valstr
508524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        , mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))
509524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        || !isParameterValid(framerate,
510524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                                      mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES)))
511524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        {
512524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("Invalid frame rate range or frame rate");
513524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            return -EINVAL;
514524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        }
515524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
5161521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // Variable framerate ranges have higher priority over
5171521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // deprecated constant FPS. "KEY_PREVIEW_FPS_RANGE" should
5181521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // be cleared by the client in order for constant FPS to get
5191521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu        // applied.
520524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( strcmp(valstr, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE))  != 0)
521a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
522524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            // APP wants to set FPS range
523524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            //Set framerate = MAXFPS
524524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGDA("APP IS CHANGING FRAME RATE RANGE");
525b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            params.getPreviewFpsRange(&minFPS, &maxFPS);
526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
527b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( ( 0 > minFPS ) || ( 0 > maxFPS ) )
528a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              {
529f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEA("ERROR: FPS Range is negative!");
530524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                return -EINVAL;
531a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              }
532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
533524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            framerate = maxFPS /CameraHal::VFR_SCALE;
534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
535524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          }
536524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        else
537524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          {
538524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman              if ( framerate != atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)) )
539a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              {
540d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman
541524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                selectFPSRange(framerate, &minFPS, &maxFPS);
542d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman                CAMHAL_LOGDB("Select FPS Range %d %d", minFPS, maxFPS);
543a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              }
544524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman              else
545524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                {
546524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    if (videoMode) {
547524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_VIDEO);
548524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        CameraParameters temp;
549524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
550524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
551524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    }
552524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    else {
553524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        valstr = mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_IMAGE);
554524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        CameraParameters temp;
555524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr);
556524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                        temp.getPreviewFpsRange(&minFPS, &maxFPS);
557524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    }
558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
559524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                    framerate = maxFPS / CameraHal::VFR_SCALE;
560524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman                }
561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
562524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman          }
563a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
564524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("FPS Range = %s", valstr);
565524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("DEFAULT FPS Range = %s", mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
567524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        minFPS /= CameraHal::VFR_SCALE;
568524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        maxFPS /= CameraHal::VFR_SCALE;
569524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
570524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( ( 0 == minFPS ) || ( 0 == maxFPS ) )
571a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
572524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("ERROR: FPS Range is invalid!");
573524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            ret = -EINVAL;
574a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          }
575524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
576524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        if ( maxFPS < minFPS )
577a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          {
578524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            CAMHAL_LOGEA("ERROR: Max FPS is smaller than Min FPS!");
579524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman            ret = -EINVAL;
580a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          }
581524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("SET FRAMERATE %d", framerate);
582524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.setPreviewFrameRate(framerate);
58308bd593a76c52f567ab844a9d92a9ffa2fe47ee9Sundar Raman        mParameters.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, params.get(CameraParameters::KEY_PREVIEW_FPS_RANGE));
584524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
585524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        CAMHAL_LOGDB("FPS Range [%d, %d]", minFPS, maxFPS);
586524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.set(TICameraParameters::KEY_MINFRAMERATE, minFPS);
587524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman        mParameters.set(TICameraParameters::KEY_MAXFRAMERATE, maxFPS);
588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
589b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( valstr = params.get(TICameraParameters::KEY_GBCE) ) != NULL )
590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
591b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GBCE Value = %s", valstr);
592b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GBCE, valstr);
593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
595b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( valstr = params.get(TICameraParameters::KEY_GLBCE) ) != NULL )
596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
597b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GLBCE Value = %s", valstr);
598b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GLBCE, valstr);
599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
601b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ///Update the current parameter set
602b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE)) != NULL)
603b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
604b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("AutoConvergence Mode is set = %s", params.get(TICameraParameters::KEY_AUTOCONVERGENCE));
605b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE, valstr);
6061521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu            }
607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
608b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES)) !=NULL )
609b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
610b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("ManualConvergence Value = %s", params.get(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES));
611b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, valstr);
612b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
614f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_EXPOSURE_MODE)) != NULL) {
615f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES))) {
616f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Exposure set = %s", valstr);
617f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr);
618f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
619f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Exposure  = %s", valstr);
620f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
621b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
622f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
624f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_WHITE_BALANCE)) != NULL) {
625f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu           if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) {
626f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGDB("White balance set %s", valstr);
627f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               mParameters.set(CameraParameters::KEY_WHITE_BALANCE, valstr);
628f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
629f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               CAMHAL_LOGEB("ERROR: Invalid white balance  = %s", valstr);
630f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu               ret = -EINVAL;
631b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
632f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
634f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) {
635f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) {
636f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Contrast set %s", valstr);
637f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_CONTRAST, valstr);
638f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
639f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Contrast  = %s", valstr);
640f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
641b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
642f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
644f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr =params.get(TICameraParameters::KEY_SHARPNESS)) != NULL) {
645f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SHARPNESS) >= 0 ) {
646f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Sharpness set %s", valstr);
647f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr);
648f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
649f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr);
650f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
651b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
652f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
654f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_SATURATION)) != NULL) {
655f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_SATURATION) >= 0 ) {
656f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Saturation set %s", valstr);
657f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_SATURATION, valstr);
658f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
659f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr);
660f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
661b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
662f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
664f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_BRIGHTNESS)) != NULL) {
665f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (params.getInt(TICameraParameters::KEY_BRIGHTNESS) >= 0 ) {
666f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Brightness set %s", valstr);
667f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr);
668f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
669f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr);
670f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
671f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            }
672f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
673f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu
674f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_ANTIBANDING)) != NULL) {
675f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) {
676f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Antibanding set %s", valstr);
677f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_ANTIBANDING, valstr);
678f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
679f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr);
680f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
681f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
682f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu         }
683f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu
684f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) {
685f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) {
686f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("ISO set %s", valstr);
687f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(TICameraParameters::KEY_ISO, valstr);
688f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
689f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr);
690f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
691b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
692f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
694b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_FOCUS_AREAS)) != NULL )
695b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
696b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGEB("Focus areas position set %s", params.get(CameraParameters::KEY_FOCUS_AREAS));
697b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_FOCUS_AREAS, valstr);
698b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
700b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL )
701b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
702b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Measurements set to %s", params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE));
703b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_MEASUREMENT_ENABLE, valstr);
704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
705b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_ENABLE) == 0)
706b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
707b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = true;
708b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
709b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else if (strcmp(valstr, (const char *) TICameraParameters::MEASUREMENT_DISABLE) == 0)
710b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
711b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
712b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
713b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
714b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
715b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mMeasurementEnabled = false;
716b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
718b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
720b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL)
721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
722b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Exposure compensation set %s", params.get(CameraParameters::KEY_EXPOSURE_COMPENSATION));
723b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr);
724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
725b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
726f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_SCENE_MODE)) != NULL) {
727f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES))) {
728f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Scene mode set %s", valstr);
729f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_SCENE_MODE, valstr);
730f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
731f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr);
732f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
734f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
735b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
736f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_FLASH_MODE)) != NULL) {
737f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES))) {
738f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Flash mode set %s", valstr);
739f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_FLASH_MODE, valstr);
740f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            } else {
741f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr);
742f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
744f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
746f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_EFFECT)) != NULL) {
747f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS))) {
748f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Effect set %s", valstr);
749f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_EFFECT, valstr);
750f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
751f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr);
752f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
753f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             }
754f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
756b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_ROTATION)) != NULL)
757b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_ROTATION) >=0))
758b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
759b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Rotation set %s", params.get(CameraParameters::KEY_ROTATION));
760b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_ROTATION, valstr);
761b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
763b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_QUALITY)) != NULL)
764b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_QUALITY) >=0))
765b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
766b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Jpeg quality set %s", params.get(CameraParameters::KEY_JPEG_QUALITY));
767b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_QUALITY, valstr);
768b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
770b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH)) != NULL)
771b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH) >=0))
772b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
773b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH));
774b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, valstr);
775b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
777b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT)) != NULL)
778b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT) >=0))
779b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
780b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail width set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT));
781b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, valstr);
782b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
784b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(( (valstr = params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY)) != NULL )
785b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            && (params.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY) >=0))
786b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
787b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Thumbnail quality set %s", params.get(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY));
788b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, valstr);
789b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
791b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_LATITUDE)) != NULL )
792b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
793b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS latitude set %s", params.get(CameraParameters::KEY_GPS_LATITUDE));
794b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_LATITUDE, valstr);
795b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
796b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_LATITUDE);
797b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
799b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_LONGITUDE)) != NULL )
800b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
801b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS longitude set %s", params.get(CameraParameters::KEY_GPS_LONGITUDE));
802b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_LONGITUDE, valstr);
803b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
804b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_LONGITUDE);
805b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
807b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_ALTITUDE)) != NULL )
808b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
809b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS altitude set %s", params.get(CameraParameters::KEY_GPS_ALTITUDE));
810b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_ALTITUDE, valstr);
811b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
812b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_ALTITUDE);
813b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
815b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_TIMESTAMP)) != NULL )
816b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
817b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS timestamp set %s", params.get(CameraParameters::KEY_GPS_TIMESTAMP));
818b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_TIMESTAMP, valstr);
819b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
820b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_TIMESTAMP);
821b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
823b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL )
824b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
825b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS datestamp set %s", params.get(TICameraParameters::KEY_GPS_DATESTAMP));
826b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr);
827b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
828b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP);
829b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
831b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL )
832b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
833b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS processing method set %s", params.get(CameraParameters::KEY_GPS_PROCESSING_METHOD));
834b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr);
835b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
836b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(CameraParameters::KEY_GPS_PROCESSING_METHOD);
837b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
839b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL )
840b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
841b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_MAPDATUM));
842b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr);
843b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
844b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM);
845b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
847b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL )
848b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
849b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("GPS MAPDATUM set %s", params.get(TICameraParameters::KEY_GPS_VERSION));
850b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr);
851b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }else{
852b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mParameters.remove(TICameraParameters::KEY_GPS_VERSION);
853b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
855b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL )
856b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
857b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("EXIF Model set %s", params.get(TICameraParameters::KEY_EXIF_MODEL));
858b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr);
859b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
861b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL )
862b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
863b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("EXIF Make set %s", params.get(TICameraParameters::KEY_EXIF_MAKE));
864b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr);
865b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
867b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL )
868b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
869b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE));
870b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valstr);
871b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
872b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else
873b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
874b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE);
875b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
877f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        if ((valstr = params.get(CameraParameters::KEY_ZOOM)) != NULL ) {
878f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu            if ((params.getInt(CameraParameters::KEY_ZOOM) >= 0 ) &&
879f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                (params.getInt(CameraParameters::KEY_ZOOM) <= mMaxZoomSupported )) {
880f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGDB("Zoom set %s", valstr);
881f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                doesSetParameterNeedUpdate(valstr,
882f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                           mParameters.get(CameraParameters::KEY_ZOOM),
883f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                           updateRequired);
884f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                mParameters.set(CameraParameters::KEY_ZOOM, valstr);
885f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu             } else {
886f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr);
887f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu                ret = -EINVAL;
888b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
889f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu        }
890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
891b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL )
892b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
893b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Auto Exposure Lock set %s", params.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
894f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
895f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       mParameters.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK),
896f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
897b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr);
898b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
900b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( (valstr = params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL )
901b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          {
902b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", params.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
903f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu            doesSetParameterNeedUpdate(valstr,
904f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       mParameters.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK),
905f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu                                       updateRequired);
906b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr);
907b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil          }
908708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev        if( (valstr = params.get(CameraParameters::KEY_METERING_AREAS)) != NULL )
909708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            {
910708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            CAMHAL_LOGEB("Metering areas position set %s", params.get(CameraParameters::KEY_METERING_AREAS));
911708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            mParameters.set(CameraParameters::KEY_METERING_AREAS, valstr);
912708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev            }
913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
914b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CameraParameters adapterParams = mParameters;
915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
916b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        // Only send parameters to adapter if preview is already
917f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter,
918f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // will be called in startPreview()
919f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        // TODO(XXX): Need to identify other parameters that need update from camera adapter
920f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        if ( (NULL != mCameraAdapter) && (mPreviewEnabled || updateRequired) ) {
921b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ret |= mCameraAdapter->setParameters(adapterParams);
922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
924b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) )
925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
926b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS);
927b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( 0 < posBracketRange )
928b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
929b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketRangePositive = posBracketRange;
930b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
932b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Positive bracketing range %d", mBracketRangePositive);
933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
935b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG) )
936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
937b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            int negBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG);
938b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( 0 < negBracketRange )
939b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
940b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketRangeNegative = negBracketRange;
941b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
943b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDB("Negative bracketing range %d", mBracketRangeNegative);
944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
945b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL) &&
946b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::BRACKET_ENABLE) == 0 ))
947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
948b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( !mBracketingEnabled )
949b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
950b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Enabling bracketing");
951b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mBracketingEnabled = true;
952b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
953b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                //Wait for AF events to enable bracketing
954b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                if ( NULL != mCameraAdapter )
955b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    {
956b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    setEventProvider( CameraHalEvent::ALL_EVENTS, mCameraAdapter );
957b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                    }
958b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
959b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            else
960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
961b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                CAMHAL_LOGDA("Bracketing already enabled");
962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
964b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else if ( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL ) &&
965b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::BRACKET_DISABLE) == 0 ))
966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
967b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling bracketing");
968b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
969b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mBracketingEnabled = false;
970b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            stopImageBracketing();
971b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
972b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            //Remove AF events subscription
973b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            if ( NULL != mEventProvider )
974b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                {
975b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mEventProvider->disableEventNotification( CameraHalEvent::ALL_EVENTS );
976b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                delete mEventProvider;
977b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                mEventProvider = NULL;
978b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil                }
979b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
982b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
983b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::SHUTTER_ENABLE) == 0 ))
984b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
985b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Enabling shutter sound");
986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
987b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = true;
988b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled |= CAMERA_MSG_SHUTTER;
989b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
990b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
991b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        else if ( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) &&
992b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            ( strcmp(valstr, TICameraParameters::SHUTTER_DISABLE) == 0 ))
993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
994b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            CAMHAL_LOGDA("Disabling shutter sound");
995b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
996b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mShutterEnabled = false;
997b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mMsgEnabled &= ~CAMERA_MSG_SHUTTER;
998b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr);
999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1001b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1003b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    //On fail restore old parameters
1004b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    if ( NO_ERROR != ret ) {
1005b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman        mParameters.unflatten(oldParams.flatten());
1006b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman    }
1007b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman
1008c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu    if ( NULL != mAppCallbackNotifier.get() ) {
1009c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        mAppCallbackNotifier->setParameters(mParameters);
1010c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu    }
1011c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu
1012b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running.
1013b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // If preview is not started yet, Video Mode parameters will take effect on next startPreview()
1014ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu    if (restartPreviewRequired && previewEnabled()) {
1015ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        CAMHAL_LOGDA("Restarting Preview");
1016b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        ret = restartPreview();
1017ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu    } else if (restartPreviewRequired && !previewEnabled() && mDisplayPaused) {
1018ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        CAMHAL_LOGDA("Stopping Preview");
1019ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        forceStopPreview();
1020ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu    }
1021ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu
1022b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if (ret != NO_ERROR)
1023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1024b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGEA("Failed to restart Preview");
1025b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        return ret;
1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1031b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
1032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat,
1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        unsigned int buffercount, unsigned int &max_queueable)
1035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() == NULL)
1041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Memory allocation of preview buffers is now placed in gralloc
1043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // CameraHal should not allocate preview buffers without DisplayAdapter
1044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
1045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mPreviewBufs)
1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///@todo Pluralise the name of this method to allocateBuffers
1050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewLength = 0;
1051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewBufs = (int32_t *) mDisplayAdapter->allocateBuffer(width, height,
1052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    previewFormat,
1053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    mPreviewLength,
1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                                    buffercount);
1055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev	if (NULL == mPreviewBufs ) {
1057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview buffers");
1058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_MEMORY;
1059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets();
1062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL == mPreviewOffsets ) {
1063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Buffer mapping failed");
1064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return BAD_VALUE;
1065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewFd = mDisplayAdapter->getFd();
1068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( -1 == mPreviewFd ) {
1069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Invalid handle");
1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return BAD_VALUE;
1071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev          }
1072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mBufProvider = (BufferProvider*) mDisplayAdapter.get();
1074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->maxQueueableBuffers(max_queueable);
1076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (ret != NO_ERROR) {
1077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         }
1079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewBufs()
1089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("mPreviewBufs = 0x%x", (unsigned int)mPreviewBufs);
1094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mPreviewBufs)
1095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///@todo Pluralise the name of this method to freeBuffers
1097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mBufProvider->freeBuffer(mPreviewBufs);
1098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewBufs = NULL;
1099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount)
1108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int bytes;
1111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bytes = size;
1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mPreviewDataBufs )
1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = freePreviewDataBufs();
1121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1126c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman        bytes = ((bytes+4095)/4096)*4096;
1127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, NULL, bytes, bufferCount);
1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes);
1130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL == mPreviewDataBufs )
1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -NO_MEMORY;
1134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes = size;
1138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = mMemoryManager->getFd();
1144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = bytes;
1145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = mMemoryManager->getOffsets();
1146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataFd = -1;
1150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataLength = 0;
1151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewDataOffsets = NULL;
1152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewDataBufs()
1160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mPreviewDataBufs )
1169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@todo Pluralise the name of this method to freeBuffers
1172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mMemoryManager->freeBuffer(mPreviewDataBufs);
1173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mPreviewDataBufs = NULL;
1174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size, const char* previewFormat, unsigned int bufferCount)
1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int bytes;
1187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bytes = size;
1191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Always allocate the buffers for image capture using MemoryManager
1193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL != mImageBufs ) )
1196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = freeImageBufs();
1198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1203c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman        bytes = ((bytes+4095)/4096)*4096;
1204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageBufs = (int32_t *)mMemoryManager->allocateBuffer(0, 0, previewFormat, bytes, bufferCount);
1205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes);
1207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL == mImageBufs )
1208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager");
1210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -NO_MEMORY;
1211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            bytes = size;
1215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = mMemoryManager->getFd();
1221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = bytes;
1222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = mMemoryManager->getOffsets();
1223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageFd = -1;
1227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageLength = 0;
1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mImageOffsets = NULL;
1229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
123672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengstatus_t CameraHal::allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount)
123772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
123872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  status_t ret = NO_ERROR;
123972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
124072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
124172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if( NULL != mVideoBufs ){
124272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    ret = freeVideoBufs(mVideoBufs);
124372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoBufs = NULL;
124472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
124572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
124672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( NO_ERROR == ret ){
124772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    int32_t stride;
124872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    buffer_handle_t *bufsArr = new buffer_handle_t [bufferCount];
124972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
125072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if (bufsArr != NULL){
125172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      for (int i = 0; i< bufferCount; i++){
125272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        GraphicBufferAllocator &GrallocAlloc = GraphicBufferAllocator::get();
125372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        buffer_handle_t buf;
125472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        ret = GrallocAlloc.alloc(width, height, HAL_PIXEL_FORMAT_NV12, CAMHAL_GRALLOC_USAGE, &buf, &stride);
125572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if (ret != NO_ERROR){
125672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          CAMHAL_LOGEA("Couldn't allocate video buffers using Gralloc");
125772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          ret = -NO_MEMORY;
125872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          for (int j=0; j< i; j++){
125972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            buf = (buffer_handle_t)bufsArr[j];
126072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            CAMHAL_LOGEB("Freeing Gralloc Buffer 0x%x", buf);
126172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            GrallocAlloc.free(buf);
126272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
126372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          delete [] bufsArr;
126472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          goto exit;
126572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        }
126672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        bufsArr[i] = buf;
126772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGVB("*** Gralloc Handle =0x%x ***", buf);
126872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
126972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
127072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      mVideoBufs = (int32_t *)bufsArr;
127172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
127272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    else{
127372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      CAMHAL_LOGEA("Couldn't allocate video buffers ");
127472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      ret = -NO_MEMORY;
127572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
127672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
127772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
127872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng exit:
127972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
128072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
128172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  return ret;
128272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
128372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
1284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid endImageCapture( void *userData)
1285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != userData )
1289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->signalEndImageCapture();
1292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid releaseImageBuffers(void *userData)
1298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1301de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman// Make releaseImageBuffers a no-op for now because it is racing against AppCallbackNotifier
1302de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman// in the home screen use-case. Image capture buffers are anyways reallocated on subsequent
1303de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman// captures and also released as part of final camera hal cleanup
1304de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman#if 0
1305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != userData )
1306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraHal *c = reinterpret_cast<CameraHal *>(userData);
1308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        c->freeImageBufs();
1309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1310de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman#endif
1311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::signalEndImageCapture()
1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w,h;
1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters adapterParams = mParameters;
1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
132488006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    if ( mBracketingRunning ) {
132588006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        stopImageBracketing();
132688006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    } else {
132788006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
132888006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman    }
1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freeImageBufs()
1336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( NULL != mImageBufs )
1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@todo Pluralise the name of this method to freeBuffers
1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mMemoryManager->freeBuffer(mImageBufs);
1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mImageBufs = NULL;
1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
1353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
1355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
136472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengstatus_t CameraHal::freeVideoBufs(void *bufs)
136572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
136672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  status_t ret = NO_ERROR;
1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
136872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
136972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
137072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  buffer_handle_t *pBuf = (buffer_handle_t*)bufs;
137172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
137272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if(pBuf == NULL)
137372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    {
137472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      CAMHAL_LOGEA("NULL pointer passed to freeVideoBuffer");
137572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      LOG_FUNCTION_NAME_EXIT;
137672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      return BAD_VALUE;
137772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
137872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
137972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  GraphicBufferAllocator &GrallocAlloc = GraphicBufferAllocator::get();
138072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
138172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  for(int i = 0; i < count; i++){
138272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    buffer_handle_t ptr = *pBuf++;
138372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    CAMHAL_LOGVB("Free Video Gralloc Handle 0x%x", ptr);
138472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    GrallocAlloc.free(ptr);
138572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
138672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
138772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
138872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
138972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  return ret;
139072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start preview mode.
1394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Camera switched to VF mode
1397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update function header with the different errors that are possible
1398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startPreview()
1401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
1405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
1406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
1407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int required_buffer_count;
1408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int max_queueble_buffers;
1409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartPreview, NULL);
1412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
14167016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if ( mPreviewEnabled ){
14177016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      CAMHAL_LOGDA("Preview already running");
14187016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      LOG_FUNCTION_NAME_EXIT;
14197016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      return ALREADY_EXISTS;
1420e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1421e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1422e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    if ( NULL != mCameraAdapter ) {
14237016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->setParameters(mParameters);
14247016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    }
14257016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng
14267016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if ((mPreviewStartInProgress == false) && (mDisplayPaused == false)){
14277016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW,( int ) &frame);
14287016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      if ( NO_ERROR != ret ){
14297016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        CAMHAL_LOGEB("Error: CAMERA_QUERY_RESOLUTION_PREVIEW %d", ret);
14307016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        return ret;
14317016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      }
14327016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng
14337016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ///Update the current preview width and height
14347016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewWidth = frame.mWidth;
14357016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewHeight = frame.mHeight;
14367016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      //Update the padded width and height - required for VNF and VSTAB
14377016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mParameters.set(TICameraParameters::KEY_PADDED_WIDTH, mPreviewWidth);
14387016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mParameters.set(TICameraParameters::KEY_PADDED_HEIGHT, mPreviewHeight);
1439e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1440e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1441e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1442e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    ///If we don't have the preview callback enabled and display adapter,
14437016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL)){
14447016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      CAMHAL_LOGEA("Preview not started. Preview in progress flag set");
14457016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      mPreviewStartInProgress = true;
14467016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SWITCH_TO_EXECUTING);
14477016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      if ( NO_ERROR != ret ){
14487016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        CAMHAL_LOGEB("Error: CAMERA_SWITCH_TO_EXECUTING %d", ret);
14497016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng        return ret;
14507016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      }
14517016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng      return NO_ERROR;
1452e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman    }
1453e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman
1454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) )
1455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Preview is in paused state");
1457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayPaused = false;
1459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewEnabled = true;
1460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("Display adapter resume failed %x", ret);
1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //restart preview callbacks
1470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME);
1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1474ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu        return ret;
1475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
1479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Allocate the preview buffers
14817016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng    ret = allocPreviewBufs(mPreviewWidth, mPreviewHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers);
1482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR != ret )
1484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't allocate buffers for Preview");
1486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( mMeasurementEnabled )
1490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA,
1493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          ( int ) &frame,
1494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                          required_buffer_count);
1495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret )
1496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
1498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ///Allocate the preview data buffers
1501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = allocPreviewDataBufs(frame.mLength, required_buffer_count);
1502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR != ret ) {
1503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't allocate preview data buffers");
1504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto error;
1505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev           }
1506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
1508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mPreviewDataBufs;
1510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mPreviewDataOffsets;
1511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mPreviewDataFd;
1512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mPreviewDataLength;
1513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) required_buffer_count;
1514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = (size_t) required_buffer_count;
1515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA,
1517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                        ( int ) &desc);
1518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Pass the buffers to Camera Adapter
1523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mBuffers = mPreviewBufs;
1524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mOffsets = mPreviewOffsets;
1525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mFd = mPreviewFd;
1526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mLength = mPreviewLength;
1527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mCount = ( size_t ) required_buffer_count;
1528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    desc.mMaxQueueable = (size_t) max_queueble_buffers;
1529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
15308fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW,
15318fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman                                      ( int ) &desc);
15328fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman
15338fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman    if ( NO_ERROR != ret )
15348fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        {
15358fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret);
15368fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        freePreviewBufs();
15378fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        return ret;
15388fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman        }
1539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count);
1541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
1543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mAppCallbackNotifier->start();
1544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( ALREADY_EXISTS == ret )
1546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Already running, do nothing
1548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("AppCallbackNotifier already running");
1549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_ERROR;
1550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else if ( NO_ERROR == ret ) {
1552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Started AppCallbackNotifier..");
1553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
1554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
1556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Couldn't start AppCallbackNotifier");
1558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Enable the display adapter if present, actual overlay enable happens when we post the buffer
1562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() != NULL)
1563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Enabling display");
1565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        bool isS3d = false;
1566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        DisplayAdapter::S3DParameters s3dParams;
1567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int width, height;
1568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mParameters.getPreviewSize(&width, &height);
1569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if 0 //TODO: s3d is not part of bringup...will reenable
1570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_SUPPORTED)) != NULL) {
1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            isS3d = (strcmp(valstr, "true") == 0);
1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D2D_PREVIEW)) != NULL) {
1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if (strcmp(valstr, "off") == 0)
1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS OFF");
1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //TODO: obtain the frame packing configuration from camera or user settings
1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                //once side by side configuration is supported
1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.mode = OVERLAY_S3D_MODE_ON;
1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("STEREO 3D->2D PREVIEW MODE IS ON");
1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.mode = OVERLAY_S3D_MODE_OFF;
1588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.framePacking = OVERLAY_S3D_FORMAT_OVERUNDER;
1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.order = OVERLAY_S3D_ORDER_LF;
1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                s3dParams.subSampling = OVERLAY_S3D_SS_NONE;
1591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif //if 0
1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview, isS3d ? &s3dParams : NULL);
1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
1600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mDisplayAdapter->enableDisplay(width, height, NULL, isS3d ? &s3dParams : NULL);
1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( ret != NO_ERROR )
1606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Couldn't enable display");
1608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto error;
1609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Send START_PREVIEW command to adapter
1614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Starting CameraAdapter preview mode");
1615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW);
1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(ret!=NO_ERROR)
1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter");
1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto error;
1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Started preview");
1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = true;
1626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStartInProgress = false;
1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    error:
1630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Performing cleanup after error");
1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Do all the cleanup
1634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        freePreviewBufs();
1635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
1636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayAdapter.get() != NULL)
1637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
16386b5eaf29c3d17a24731bf9271bd0d199d433813eAkwasi Boateng            mDisplayAdapter->disableDisplay(false);
1639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stop();
1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewStartInProgress = false;
1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mPreviewEnabled = false;
1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
1646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Sets ANativeWindow object.
1650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it
1652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   to render buffers to display.
1653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] window The ANativeWindow object created by Surface flinger
1655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the ANativeWindow object passes validation criteria
1656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios
1657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::setPreviewWindow(struct preview_stream_ops *window)
1660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
1663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = true;
1666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter
1668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!window)
1669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mDisplayAdapter.get() != NULL)
1671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///NULL window passed, destroy the display adapter if present
1673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("NULL window passed, destroying display adapter");
1674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mDisplayAdapter.clear();
1675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client
1676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ///@remarks so, we will wait until it passes a valid window to begin the preview again
1677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSetPreviewWindowCalled = false;
1678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("NULL ANativeWindow passed to setPreviewWindow");
1680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_ERROR;
1681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }else if(mDisplayAdapter.get() == NULL)
1682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Need to create the display adapter since it has not been created
1684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Create display adapter
1685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter = new ANativeWindowDisplayAdapter();
1686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = NO_ERROR;
1687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR))
1688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if(ret!=NO_ERROR)
1690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                mDisplayAdapter.clear();
1692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("DisplayAdapter initialize failed");
1693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                LOG_FUNCTION_NAME_EXIT;
1694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return ret;
1695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            else
1697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEA("Couldn't create DisplayAdapter");
1699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                LOG_FUNCTION_NAME_EXIT;
1700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                return NO_MEMORY;
1701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // DisplayAdapter needs to know where to get the CameraFrames from inorder to display
1705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter
1706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->setFrameProvider(mCameraAdapter);
1707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Any dynamic errors that happen during the camera use case has to be propagated back to the application
1709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
1710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Set it as the error handler for the DisplayAdapter
1711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get());
1712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Update the display adapter with the new window that is passed from CameraService
1714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret  = mDisplayAdapter->setPreviewWindow(window);
1715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(ret!=NO_ERROR)
1716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
1717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret);
1718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
1719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(mPreviewStartInProgress)
1721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGDA("setPreviewWindow called when preview running");
1723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            // Start the preview since the window is now available
1724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = startPreview();
1725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }else
1727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
1728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /* If mDisplayAdpater is already created. No need to do anything.
1729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         * We get a surface handle directly now, so we can reconfigure surface
1730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         * itself in DisplayAdapter if dimensions have changed
1731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         */
1732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
1733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
1742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
1745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopPreview()
1748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled() && !mDisplayPaused)
1752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
1754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
1755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
17570e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman    bool imageCaptureRunning = (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE) &&
17580e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman                                    (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE);
17590e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman    if(mDisplayPaused && !imageCaptureRunning)
1760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Display is paused, which essentially means there is no preview active.
1762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // Note: this is done so that when stopPreview is called by client after
1763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // an image capture, we do not de-initialize the camera adapter and
1764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        // restart over again.
176597db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu
1766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
1767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    forceStopPreview();
1770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1771b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Reset Capture-Mode to default, so that when we switch from VideoRecording
1772b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE.
1773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Resetting Capture-Mode to default");
1774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
1775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if preview is enabled
1781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If preview is running currently
1784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If preview has been stopped
1785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::previewEnabled()
1788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return (mPreviewEnabled || mPreviewStartInProgress);
1792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start record mode.
1796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with
1798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  the corresponding frame. Every record frame must be released by calling
1799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev  releaseRecordingFrame().
1800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If recording could be started without any issues
1803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Update the header with possible error values in failure scenarios
1804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
1806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startRecording( )
1807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int w, h;
1809b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
1810b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
1811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
1817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            gettimeofday(&mStartPreview, NULL);
1819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
1821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled())
1823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
1825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
18279743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // set internal recording hint in case camera adapter needs to make some
18289743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // decisions....(will only be sent to camera adapter if camera restart is required)
18299743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    mParameters.set(TICameraParameters::KEY_RECORDING_HINT, CameraParameters::TRUE);
18309743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
18319743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // if application starts recording in continuous focus picture mode...
18329743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // then we need to force default capture mode (as opposed to video mode)
18339743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    if ( ((valstr = mParameters.get(CameraParameters::KEY_FOCUS_MODE)) != NULL) &&
18349743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu         (strcmp(valstr, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0) ){
18359743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        restartPreviewRequired = resetVideoModeParameters();
18369743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
18379743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
18389743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // only need to check recording hint if preview restart is not already needed
1839b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
18409743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    if ( !restartPreviewRequired &&
18419743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu         (!valstr || (valstr && (strcmp(valstr, CameraParameters::TRUE) != 0))) ) {
18428b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        restartPreviewRequired = setVideoModeParameters(mParameters);
18439743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
1844b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
18459743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    if (restartPreviewRequired) {
18469743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu        ret = restartPreview();
18479743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    }
1848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
185072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      {
185172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS));
185272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        mParameters.getPreviewSize(&w, &h);
185372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGDB("%s Video Width=%d Height=%d", __FUNCTION__, mVideoWidth, mVideoHeight);
185472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
185572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if ((w != mVideoWidth) && (h != mVideoHeight))
185672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
185772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = allocVideoBufs(mVideoWidth, mVideoHeight, count);
185872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            if ( NO_ERROR != ret )
185972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              {
186072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
18619743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu                mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
186272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng                return ret;
186372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              }
186472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
186572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->useVideoBuffers(true);
186672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->setVideoRes(mVideoWidth, mVideoHeight);
186772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, count, mVideoBufs);
186872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
186972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        else
187072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
187172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->useVideoBuffers(false);
187272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            mAppCallbackNotifier->setVideoRes(mPreviewWidth, mPreviewHeight);
187372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBufs, mPreviewOffsets, mPreviewFd, mPreviewLength, count, NULL);
187472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
187572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
1876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret = mAppCallbackNotifier->startRecording();
1880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter
1885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         ret =  mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO);
1886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
1889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mRecordingEnabled = true;
1891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
1894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
1896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
1897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
1899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Set the camera parameters specific to Video Recording.
1900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function checks for the camera parameters which have to be set for recording.
1902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it.
1903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function also enables Video Recording specific functions like VSTAB & VNF.
1904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
1906b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Modify the policies for enabling VSTAB & VNF usecase based later.
1908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
19108b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luubool CameraHal::setVideoModeParameters(const CameraParameters& params)
1911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
1912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *valstr = NULL;
1913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool restartPreviewRequired = false;
1914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
1915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
1917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
1919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
1920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( (valstr == NULL) ||
1921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ( (valstr != NULL) && (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) ) )
1922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
1923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE");
1924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE);
1925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        restartPreviewRequired = true;
1926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
1927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1928cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    // Check if CAPTURE_MODE is VIDEO_MODE, since VSTAB & VNF work only in VIDEO_MODE.
1929cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
19308b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    if (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) == 0) {
19318b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu       // set VSTAB. restart is required if vstab value has changed
19328b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu       if (params.get(CameraParameters::KEY_VIDEO_STABILIZATION) != NULL) {
19338b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            // make sure we support vstab
19348b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED),
19358b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                       CameraParameters::TRUE) == 0) {
19368b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                valstr = mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION);
19378b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                // vstab value has changed
19388b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                if ((valstr != NULL) &&
19398b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                     strcmp(valstr, params.get(CameraParameters::KEY_VIDEO_STABILIZATION)) != 0) {
19408b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                    restartPreviewRequired = true;
19418b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                }
19428b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                mParameters.set(CameraParameters::KEY_VIDEO_STABILIZATION,
19438b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                                params.get(CameraParameters::KEY_VIDEO_STABILIZATION));
1944cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            }
19458b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        } else if (mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION)) {
19468b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            // vstab was configured but now unset
19478b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            restartPreviewRequired = true;
19488b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            mParameters.remove(CameraParameters::KEY_VIDEO_STABILIZATION);
19498b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        }
1950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
19518b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        // Set VNF
19528b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        if (params.get(TICameraParameters::KEY_VNF) == NULL) {
1953cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Enable VNF");
1954cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VNF, "1");
1955cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
19568b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        } else {
19578b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            valstr = mParameters.get(TICameraParameters::KEY_VNF);
19588b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            if (valstr && strcmp(valstr, params.get(TICameraParameters::KEY_VNF)) != 0) {
19598b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu                restartPreviewRequired = true;
1960cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            }
19618b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu            mParameters.set(TICameraParameters::KEY_VNF, params.get(TICameraParameters::KEY_VNF));
19628b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        }
1963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
1964cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU.
1965cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048.
1966cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil        // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution.
19678b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        valstr = mParameters.get(CameraParameters::KEY_VIDEO_STABILIZATION);
19688b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu        if (valstr && (strcmp(valstr, CameraParameters::TRUE) == 0) && (mPreviewWidth == 1920)) {
1969cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            CAMHAL_LOGDA("Force Enable VNF for 1080p");
1970cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            mParameters.set(TICameraParameters::KEY_VNF, "1");
1971cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil            restartPreviewRequired = true;
1972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
19738b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    }
1974b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
1975b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1976b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
1977b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
1978b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1979b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
1980b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Reset the camera parameters specific to Video Recording.
1981b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1982b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF.
1983b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1984b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
1985b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect.
1986b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1987b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
1988b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilbool CameraHal::resetVideoModeParameters()
1989b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
1990b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
1991b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    bool restartPreviewRequired = false;
1992b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
1993b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1994b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
1995b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
1996d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    // ignore this if we are already recording
1997d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    if (mRecordingEnabled) {
1998d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu        return false;
1999d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu    }
2000d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu
2001b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview
2002b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
20038b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    if ((valstr != NULL) && (strcmp(valstr, TICameraParameters::VIDEO_MODE) == 0)) {
2004b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        CAMHAL_LOGDA("Reset Capture-Mode to default");
2005b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_CAP_MODE, "");
2006b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        restartPreviewRequired = true;
20078b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    }
2008b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2009b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME_EXIT;
2010b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2011b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    return restartPreviewRequired;
2012b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil}
2013b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2014b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/**
2015b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @brief Restart the preview with setParameter.
2016b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2017b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   This function restarts preview, for some VIDEO_MODE parameters to take effect.
2018b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2019b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @param none
2020b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil   @return NO_ERROR If recording parameters could be set without any issues
2021b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2022b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */
2023b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilstatus_t CameraHal::restartPreview()
2024b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{
2025b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    const char *valstr = NULL;
2026b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    char tmpvalstr[30];
2027b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    status_t ret = NO_ERROR;
2028b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2029b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    LOG_FUNCTION_NAME;
2030b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2031b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview().
2032b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    tmpvalstr[0] = 0;
2033b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2034b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    if(valstr != NULL)
2035b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        {
2036b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        if(sizeof(tmpvalstr) < (strlen(valstr)+1))
2037b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            {
2038b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            return -EINVAL;
2039b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil            }
2040b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2041e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman        strncpy(tmpvalstr, valstr, sizeof(tmpvalstr));
2042b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        tmpvalstr[sizeof(tmpvalstr)-1] = 0;
2043b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        }
2044b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2045ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu    forceStopPreview();
2046b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2047b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    {
2048b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        Mutex::Autolock lock(mLock);
2049b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mParameters.set(TICameraParameters::KEY_CAP_MODE, tmpvalstr);
2050b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil        mCameraAdapter->setParameters(mParameters);
2051b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    }
2052b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2053b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil    ret = startPreview();
2054b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil
2055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started recording.
2062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopRecording()
2068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
20697d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    CameraAdapter::AdapterState currentState;
20707d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
20737d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    Mutex::Autolock lock(mLock);
20747d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (!mRecordingEnabled )
2076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return;
2078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
20807d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    currentState = mCameraAdapter->getState();
20817d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) {
20827d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
20837d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu    }
20847d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu
2085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->stopRecording();
2086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO);
2088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
2090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
209172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if ( mAppCallbackNotifier->getUesVideoBuffers() ){
209272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      freeVideoBufs(mVideoBufs);
209372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      if (mVideoBufs){
209472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        CAMHAL_LOGVB(" FREEING mVideoBufs 0x%x", mVideoBufs);
209572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        delete [] mVideoBufs;
209672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
209772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      mVideoBufs = NULL;
209872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    }
209972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
21009743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // reset internal recording hint in case camera adapter needs to make some
21019743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // decisions....(will only be sent to camera adapter if camera restart is required)
21029743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    mParameters.remove(TICameraParameters::KEY_RECORDING_HINT);
21039743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
2104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Returns true if recording is enabled.
2109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return true If recording is currently running
2112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         false If recording has been stopped
2113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::recordingEnabled()
2116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mRecordingEnabled;
2122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME.
2126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers
2128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev               previously given by CameraHal
2129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::releaseRecordingFrame(const void* mem)
2133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //CAMHAL_LOGDB(" 0x%x", mem->pointer());
2137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( mRecordingEnabled ) && mem != NULL)
2139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->releaseRecordingFrame(mem);
2141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return;
2146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Start auto focus
2150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This call asynchronous.
2152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   The notification callback routine is called with CAMERA_MSG_FOCUS once when
2153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focusing is complete. autoFocus() will be called again if another auto focus is
2154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   needed.
2155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR
2158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes if the focus is not locked
2159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::autoFocus()
2162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&mStartFocus, NULL);
2168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
21742ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    {
21752ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    Mutex::Autolock lock(mLock);
21762ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    mMsgEnabled |= CAMERA_MSG_FOCUS;
21772ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    }
21782ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
21792ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
2180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter )
2181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //pass the autoFocus timestamp along with the command to camera adapter
2186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus);
2187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS);
2191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -1;
2198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancels auto-focus function.
2207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   If the auto-focus is still in progress, this function will cancel it.
2209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Whether the auto-focus is in progress or not, this function will return the
2210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   focus position to the default. If the camera does not support auto-focus, this is a no-op.
2211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the cancel succeeded
2215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if cancel didnt succeed
2216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelAutoFocus()
2219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
22212ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
22222ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    {
22232ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    Mutex::Autolock lock(mLock);
22242ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    mMsgEnabled &= ~CAMERA_MSG_FOCUS;
22252ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu    }
22262ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu
2227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
2228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
2230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier)
2236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
2241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
2244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
2245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay);
2248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == mEventProvider )
2249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error in creating EventProvider");
2251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
2253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->enableEventNotification(eventMask);
2255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallbackRelay(CameraHalEvent* event)
2261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraHal *appcbn = ( CameraHal * ) (event->mCookie);
2265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    appcbn->eventCallback(event );
2266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallback(CameraHalEvent* event)
2271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != event )
2275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch( event->mEventType )
2277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CameraHalEvent::EVENT_FOCUS_LOCKED:
2279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CameraHalEvent::EVENT_FOCUS_ERROR:
2280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                if ( mBracketingEnabled )
2282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    {
2283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    startImageBracketing();
2284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                    }
2285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
2288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
2292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startImageBracketing()
2298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        status_t ret = NO_ERROR;
2300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraFrame frame;
2301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CameraAdapter::BuffersDescriptor desc;
2302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        gettimeofday(&mStartCapture, NULL);
2306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
2310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if(!previewEnabled() && !mDisplayPaused)
2312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            LOG_FUNCTION_NAME_EXIT;
2314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
2315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( !mBracketingEnabled )
2318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return ret;
2320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mBracketingRunning = true;
2325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &frame,
2331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( mBracketRangeNegative + 1 ));
2332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NULL != mAppCallbackNotifier.get() )
2342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
2344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mParameters.getPictureSize(( int * ) &frame.mWidth,
2350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                       ( int * ) &frame.mHeight);
2351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = allocImageBufs(frame.mWidth,
2353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mHeight,
2354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mLength,
2355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mParameters.getPictureFormat(),
2356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 ( mBracketRangeNegative + 1 ));
2357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
235872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              {
2359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
236072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng              }
2361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mImageBufs;
2367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
2368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
2369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
2370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 );
2371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = ( size_t ) ( mBracketRangeNegative + 1 );
2372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
2375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
2377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 //pass capture timestamp along with the camera adapter command
2382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE,  ( mBracketRangePositive + 1 ),  (int) &mStartCapture);
2383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ));
2387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
2394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::stopImageBracketing()
2397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        status_t ret = NO_ERROR;
2399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME;
2401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
240288006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        if( !previewEnabled() )
2403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            return NO_INIT;
2405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
240788006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        mBracketingRunning = false;
240888006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman
240988006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE);
2410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return ret;
2414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Take a picture.
2418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If able to switch to image capture
2421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes if unable to switch to image capture
2422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::takePicture( )
2425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraFrame frame;
2428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraAdapter::BuffersDescriptor desc;
2429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int burst;
2430ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    const char *valstr = NULL;
2431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    unsigned int bufferCount = 1;
2432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&mStartCapture, NULL);
2438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!previewEnabled() && !mDisplayPaused)
2444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
2446ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Preview not started...");
2447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
2448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2450ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // return error if we are already capturing
2451ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE &&
2452ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu          mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) ||
2453ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE &&
2454ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu          mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE) ) {
2455ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Already capturing an image...");
2456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_INIT;
2457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2459ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    // we only support video snapshot if we are in video mode (recording hint is set)
2460ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE);
2461ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) &&
2462ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu         (valstr && strcmp(valstr, TICameraParameters::VIDEO_MODE)) ) {
2463ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        CAMHAL_LOGEA("Trying to capture while recording without recording hint set...");
2464ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        return INVALID_OPERATION;
2465ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu    }
2466ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu
2467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( !mBracketingRunning )
2468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if ( NO_ERROR == ret )
2471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            burst = mParameters.getInt(TICameraParameters::KEY_BURST);
2473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //Allocate all buffers only in burst capture case
2476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         if ( burst > 1 )
2477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
2478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             bufferCount = CameraHal::NO_BUFFERS_IMAGE_CAPTURE;
2479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( NULL != mAppCallbackNotifier.get() )
2480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(true);
2482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
2484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         else
2485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             {
2486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             if ( NULL != mAppCallbackNotifier.get() )
2487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 {
2488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 mAppCallbackNotifier->setBurst(false);
2489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                 }
2490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev             }
2491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2492ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // pause preview during normal image capture
2493ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        // do not pause preview if recording (video state)
2494ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if (NO_ERROR == ret &&
2495ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                NULL != mDisplayAdapter.get() &&
2496ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                burst < 1) {
2497ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) {
2498ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mDisplayPaused = true;
2499ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                mPreviewEnabled = false;
2500ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                ret = mDisplayAdapter->pauseDisplay(mDisplayPaused);
2501ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                // since preview is paused we should stop sending preview frames too
2502ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) {
2503ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                    mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME);
2504ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu                }
2505ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu            }
2506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mDisplayAdapter->setSnapshotTimeRef(&mStartCapture);
2509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2510ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        }
2511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2512c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        // if we taking video snapshot...
2513c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        if ((NO_ERROR == ret) && (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE)) {
2514c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            // enable post view frames if not already enabled so we can internally
2515c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            // save snapshot frames for generating thumbnail
2516c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            if((mMsgEnabled & CAMERA_MSG_POSTVIEW_FRAME) == 0) {
2517c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu                mAppCallbackNotifier->enableMsgType(CAMERA_MSG_POSTVIEW_FRAME);
2518c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu            }
2519c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu        }
2520c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu
2521ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu        if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) )
2522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR == ret )
2524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE,
2525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  ( int ) &frame,
2526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                                  bufferCount);
2527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret);
2531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NO_ERROR == ret )
2535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mParameters.getPictureSize(( int * ) &frame.mWidth,
2537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                       ( int * ) &frame.mHeight);
2538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = allocImageBufs(frame.mWidth,
2540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mHeight,
2541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 frame.mLength,
2542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 mParameters.getPictureFormat(),
2543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                 bufferCount);
2544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            if ( NO_ERROR != ret )
2545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                {
2546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret);
2547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                }
2548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (  (NO_ERROR == ret) && ( NULL != mCameraAdapter ) )
2551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mBuffers = mImageBufs;
2553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mOffsets = mImageOffsets;
2554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mFd = mImageFd;
2555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mLength = mImageLength;
2556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mCount = ( size_t ) bufferCount;
2557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            desc.mMaxQueueable = ( size_t ) bufferCount;
2558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE,
2560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                                              ( int ) &desc);
2561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( NULL != mCameraAdapter ) )
2565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         //pass capture timestamp along with the camera adapter command
2570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE,  (int) &mStartCapture);
2571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else
2573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE);
2575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Cancel a picture that was started with takePicture.
2585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Calling this method when no picture is being taken is a no-op.
2587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent
2590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define error codes
2591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelPicture( )
2594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    Mutex::Autolock lock(mLock);
2598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
2600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Return the camera parameters.
2606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return Currently configured camera parameters
2609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar* CameraHal::getParameters()
2612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    String8 params_str8;
2614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char* params_string;
261572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    const char * valstr = NULL;
2616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if( NULL != mCameraAdapter )
2620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2621f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        mCameraAdapter->getParameters(mParameters);
2622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
262472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    CameraParameters mParams = mParameters;
262572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
262672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    // Handle RECORDING_HINT to Set/Reset Video Mode Parameters
262772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    valstr = mParameters.get(CameraParameters::KEY_RECORDING_HINT);
262872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    if(valstr != NULL)
262972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      {
263072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng        if(strcmp(valstr, CameraParameters::TRUE) == 0)
263172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          {
263272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            //HACK FOR MMS MODE
263372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng            resetPreviewRes(&mParams, mVideoWidth, mVideoHeight);
263472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng          }
263572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng      }
2636524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
26379743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    // do not send internal parameters to upper layers
26389743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu    mParams.remove(TICameraParameters::KEY_RECORDING_HINT);
26399743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu
264072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    params_str8 = mParams.flatten();
2641524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman
2642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // camera service frees this string...
2643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    params_string = (char*) malloc(sizeof(char) * (params_str8.length()+1));
2644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    strcpy(params_string, params_str8.string());
2645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Return the current set of parameters
2649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return params_string;
2651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::putParameters(char *parms)
2654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    free(parms);
2656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Send command to camera driver.
2660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR If the command succeeds
2663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo Define the error codes that this function can return
2664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
2667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
2669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) )
2674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("No CameraAdapter instance");
2676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
2677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( ( NO_ERROR == ret ) && ( !previewEnabled() ))
2680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Preview is not running");
2682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = -EINVAL;
2683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
2686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        switch(cmd)
2688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_SMOOTH_ZOOM:
2690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1);
2692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_SMOOTH_ZOOM:
2695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM);
2697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_START_FACE_DETECTION:
2699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD);
2701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            case CAMERA_CMD_STOP_FACE_DETECTION:
2705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
2707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            default:
2711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev                break;
2712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            };
2713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
2718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Release the hardware resources owned by this object.
2722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Note that this is *not* done in the destructor.
2724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
2726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
2727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::release()
2730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@todo Investigate on how release is used by CameraService. Vaguely remember that this is called
2733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///just before CameraHal object destruction
2734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
2735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Dump state of the camera hardware
2741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] fd    File descriptor
2743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param[in] args  Arguments
2744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR Dump succeeded
2745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @todo  Error codes for dump fail
2746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t  CameraHal::dump(int fd) const
2749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Implement this method when the h/w dump function is supported on Ducati side
2752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
2753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Interface Method definitions ENDS here--------------------*/
2756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Internal Method definitions STARTS here--------------------*/
2761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Constructor of CameraHal
2764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Member variables are initialized here.  No allocations should be done here as we
2766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   don't use c++ exceptions in the code.
2767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::CameraHal(int cameraId)
2770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize all the member variables to their defaults
2774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
2775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewBufs = NULL;
2776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageBufs = NULL;
2777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBufProvider = NULL;
2778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStartInProgress = false;
2779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBufs = NULL;
2780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoBufProvider = NULL;
2781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = false;
2782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
2783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
2784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMsgEnabled = 0;
2785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier = NULL;
2786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMemoryManager = NULL;
2787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter = NULL;
2788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingEnabled = false;
2789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketingRunning = false;
2790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mEventProvider = NULL;
2791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangePositive = 1;
2792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mBracketRangeNegative = 1;
2793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = 0;
2794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mShutterEnabled = true;
2795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMeasurementEnabled = false;
2796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataBufs = NULL;
2797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = NULL;
2798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCurrentTime = 0;
2799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mFalsePreview = 0;
2800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageOffsets = NULL;
2801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageLength = 0;
2802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mImageFd = 0;
2803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoOffsets = NULL;
2804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoFd = 0;
2805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mVideoLength = 0;
2806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataOffsets = NULL;
2807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataFd = 0;
2808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewDataLength = 0;
2809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewFd = 0;
2810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewWidth = 0;
2811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewHeight = 0;
2812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewLength = 0;
2813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewOffsets = NULL;
2814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewRunning = 0;
2815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewStateOld = 0;
2816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordingEnabled = 0;
2817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mRecordEnabled = 0;
2818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = NULL;
281972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoWidth = 0;
282072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mVideoHeight = 0;
2821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS
2823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Initialize the CameraHAL constructor timestamp, which is used in the
2825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // PPM() method as time reference if the user does not supply one.
2826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    gettimeofday(&ppm_start, NULL);
2827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif
2829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraIndex = cameraId;
2831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Destructor of CameraHal
2837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   This function simply calls deinitialize() to free up memory allocate during construct
2839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   phase
2840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::~CameraHal()
2842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Call de-initialize here once more - it is the last chance for us to relinquish all the h/w and s/w resources
2846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    deinitialize();
2847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mEventProvider )
2849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS);
2851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        delete mEventProvider;
2852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mEventProvider = NULL;
2853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the callback notifier
2856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier.clear();
2857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    /// Free the display adapter
2859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayAdapter.clear();
2860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
2862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        int strongCount = mCameraAdapter->getStrongCount();
2863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter->decStrong(mCameraAdapter);
2865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
2867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2869de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    freeImageBufs();
2870de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
2871de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    /// Free the memory manager
2872de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman    mMemoryManager.clear();
2873de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman
2874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
2875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
2876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
2878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Initialize the Camera HAL
2879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Creates CameraAdapter, AppCallbackNotifier, DisplayAdapter and MemoryManager
2881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param None
2883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return NO_ERROR - On success
2884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev         NO_MEMORY - On failure to allocate memory for any of the objects
2885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @remarks Camera Hal internal function
2886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
2888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::initialize(CameraProperties::Properties* properties)
2890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
2891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
2892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int sensor_index = 0;
2894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize the event mask used for registering an event provider for AppCallbackNotifier
2896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Currently, registering all events as to be coming from CameraAdapter
2897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int32_t eventMask = CameraHalEvent::ALL_EVENTS;
2898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Get my camera properties
2900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties = properties;
2901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mCameraProperties)
2903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    {
2904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Dump the properties of this Camera
2908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // will only print if DEBUG macro is defined
2909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraProperties->dump();
2910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)) != 0 )
2912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        sensor_index = atoi(mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX));
2914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDB("Sensor index %d", sensor_index);
2917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
29189a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu    mCameraAdapter = CameraAdapter_Factory(sensor_index);
29199a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu    if ( ( NULL == mCameraAdapter ) || (mCameraAdapter->initialize(properties)!=NO_ERROR))
2920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Unable to create or initialize CameraAdapter");
2922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mCameraAdapter = NULL;
2923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->incStrong(mCameraAdapter);
2927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerImageReleaseCallback(releaseImageBuffers, (void *) this);
2928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->registerEndCaptureCallback(endImageCapture, (void *)this);
2929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mAppCallbackNotifier.get())
2931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create the callback notifier
2933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier = new AppCallbackNotifier();
2934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mAppCallbackNotifier.get() ) || ( mAppCallbackNotifier->initialize() != NO_ERROR))
2935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize AppCallbackNotifier");
2937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
2938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(!mMemoryManager.get())
2942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        /// Create Memory Manager
2944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mMemoryManager = new MemoryManager();
2945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if( ( NULL == mMemoryManager.get() ) || ( mMemoryManager->initialize() != NO_ERROR))
2946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
2947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Unable to create or initialize MemoryManager");
2948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            goto fail_loop;
2949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
2950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Setup the class dependencies...
2953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///AppCallbackNotifier has to know where to get the Camera frames and the events like auto focus lock etc from.
2955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///CameraAdapter is the one which provides those events
2956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the frame and event providers for AppCallbackNotifier
2957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///@remarks  setEventProvider API takes in a bit mask of events for registering a provider for the different events
2958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         That way, if events can come from DisplayAdapter in future, we will be able to add it as provider
2959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///         for any event
2960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setEventProvider(eventMask, mCameraAdapter);
2961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setFrameProvider(mCameraAdapter);
2962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Any dynamic errors that happen during the camera use case has to be propagated back to the application
2964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that  notifies such errors to the application
2965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set it as the error handler for CameraAdapter
2966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mCameraAdapter->setErrorHandler(mAppCallbackNotifier.get());
2967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Start the callback notifier
2969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier->start() != NO_ERROR)
2970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      {
2971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Couldn't start AppCallbackNotifier");
2972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto fail_loop;
2973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev      }
2974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CAMHAL_LOGDA("Started AppCallbackNotifier..");
2976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mAppCallbackNotifier->setMeasurements(mMeasurementEnabled);
2977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Initialize default parameters
2979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    initDefaultParameters();
2980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( setParameters(mParameters) != NO_ERROR )
2983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
2984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Failed to set default parameters?!");
2985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
2987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // register for sensor events
2988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSensorListener = new SensorListener();
2989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
2990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if (mSensorListener->initialize() == NO_ERROR) {
2991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->setCallbacks(orientation_cb, this);
2992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener->enableSensor(SensorListener::SENSOR_ORIENTATION);
2993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        } else {
2994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEA("Error initializing SensorListener. not fatal, continuing");
2995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener.clear();
2996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            mSensorListener = NULL;
2997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
2998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
2999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return NO_ERROR;
3003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    fail_loop:
3005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Free up the resources because we failed somewhere up
3007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        deinitialize();
3008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        LOG_FUNCTION_NAME_EXIT;
3009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return NO_MEMORY;
3011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions)
3015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
3017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status = NO_ERROR;
3018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
3020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedResolutions )
3024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported resolutions string");
3026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status = snprintf(tmpBuffer, PARAM_BUFFER, "%dx%d", width, height);
3031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 > status )
3032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
3034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedResolutions, tmpBuffer);
3039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(const char *param, const char *supportedParams)
3056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
3058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
3059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedParams )
3063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
3065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == param )
3070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid parameter string");
3072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedParams, param);
3077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(int param, const char *supportedParams)
3094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    bool ret = true;
3096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *pos = NULL;
3097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t status;
3098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == supportedParams )
3103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Invalid supported parameters string");
3105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status = snprintf(tmpBuffer, PARAM_BUFFER, "%d", param);
3110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( 0 > status )
3111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        CAMHAL_LOGEA("Error encountered while generating validation string");
3113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        goto exit;
3115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    pos = strstr(supportedParams, tmpBuffer);
3118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == pos )
3119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = false;
3121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ret = true;
3125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit:
3128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3134f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luustatus_t CameraHal::doesSetParameterNeedUpdate(const char* new_param, const char* old_param, bool& update) {
3135f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if (!new_param || !old_param) {
3136f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu        return -EINVAL;
3137f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
3138f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3139f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    // if params mismatch we should update parameters for camera adapter
3140f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    if ((strcmp(new_param, old_param) != 0)) {
3141f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu       update = true;
3142f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu    }
3143f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3144f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu   return NO_ERROR;
3145f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu}
3146f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu
3147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::parseResolution(const char *resStr, int &width, int &height)
3148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
3150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *ctx, *pWidth, *pHeight;
3151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    const char *sep = "x";
3152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *tmp = NULL;
3153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL == resStr )
3157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        return -EINVAL;
3159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //This fixes "Invalid input resolution"
3162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char *resStr_copy = (char *)malloc(strlen(resStr) + 1);
3163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL!=resStr_copy ) {
3164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        strcpy(resStr_copy, resStr);
3167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pWidth = strtok_r( (char *) resStr_copy, sep, &ctx);
3168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pWidth )
3170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            width = atoi(pWidth);
3172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
3174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
3177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        pHeight = strtok_r(NULL, sep, &ctx);
3183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        if ( NULL != pHeight )
3185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            height = atoi(pHeight);
3187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        else
3189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            {
3190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            CAMHAL_LOGEB("Invalid input resolution %s", resStr);
3191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            ret = -EINVAL;
3192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev            }
3193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        free(resStr_copy);
3196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        resStr_copy = NULL;
3197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev     }
3198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return ret;
3201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::insertSupportedParams()
3204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    char tmpBuffer[PARAM_BUFFER + 1];
3206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters &p = mParameters;
3210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ///Set the name of the camera
3212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CAMERA_NAME, mCameraProperties->get(CameraProperties::CAMERA_NAME));
3213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mMaxZoomSupported = atoi(mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES));
3217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS));
3218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES));
3219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS));
3220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES));
3221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_THUMBNAIL_SIZES));
3222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE));
3223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_EFFECTS, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS));
3224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES));
3226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES));
3227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING));
3228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MAX));
3229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MIN));
3230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_EV_STEP));
3231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES));
3232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES));
3233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_ISO_VALUES, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES));
3234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM_RATIOS, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_RATIOS));
3235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_ZOOM, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES));
3236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::ZOOM_SUPPORTED));
3237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::SMOOTH_ZOOM_SUPPORTED));
3238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SUPPORTED_IPP, mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES));
3239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D_SUPPORTED,mCameraProperties->get(CameraProperties::S3D_SUPPORTED));
3240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D2D_PREVIEW_MODE,mCameraProperties->get(CameraProperties::S3D2D_PREVIEW_MODES));
3241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE));
3242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
32438b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    p.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED));
3244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED));
3245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED));
3248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED));
32499919dafce4d57f0b9b9aedafc95b756464685009Tyler Luu    p.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, mCameraProperties->get(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED));
3250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::initDefaultParameters()
3256c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Purpose of this function is to initialize the default current and supported parameters for the currently
3258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //selected camera.
3259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    CameraParameters &p = mParameters;
3261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int currentRevision, adapterRevision;
3262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    status_t ret = NO_ERROR;
3263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    int width, height;
3264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PREVIEW_SIZE), width, height);
3268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(width, height);
3272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT);
3276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::PICTURE_SIZE), width, height);
3279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(width, height);
3283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.setPictureSize(PICTURE_WIDTH, PICTURE_HEIGHT);
3287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    ret = parseResolution(mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_SIZE), width, height);
3290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NO_ERROR == ret )
3292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width);
3294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height);
3295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    else
3297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        {
3298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, MIN_WIDTH);
3299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        p.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, MIN_HEIGHT);
3300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        }
3301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    insertSupportedParams();
3303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    //Insert default values
3305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFrameRate(atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE)));
3306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPreviewFormat(mCameraProperties->get(CameraProperties::PREVIEW_FORMAT));
3307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.setPictureFormat(mCameraProperties->get(CameraProperties::PICTURE_FORMAT));
3308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_JPEG_QUALITY, mCameraProperties->get(CameraProperties::JPEG_QUALITY));
3309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_WHITE_BALANCE, mCameraProperties->get(CameraProperties::WHITEBALANCE));
3310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EFFECT,  mCameraProperties->get(CameraProperties::EFFECT));
3311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ANTIBANDING, mCameraProperties->get(CameraProperties::ANTIBANDING));
3312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FOCUS_MODE, mCameraProperties->get(CameraProperties::FOCUS_MODE));
3314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::EV_COMPENSATION));
3315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_SCENE_MODE, mCameraProperties->get(CameraProperties::SCENE_MODE));
3316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE));
3317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_ZOOM, mCameraProperties->get(CameraProperties::ZOOM));
3318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_CONTRAST, mCameraProperties->get(CameraProperties::CONTRAST));
3319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SATURATION, mCameraProperties->get(CameraProperties::SATURATION));
3320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_BRIGHTNESS, mCameraProperties->get(CameraProperties::BRIGHTNESS));
3321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SHARPNESS, mCameraProperties->get(CameraProperties::SHARPNESS));
3322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXPOSURE_MODE, mCameraProperties->get(CameraProperties::EXPOSURE_MODE));
3323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_ISO, mCameraProperties->get(CameraProperties::ISO_MODE));
3324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_IPP, mCameraProperties->get(CameraProperties::IPP));
3325d054c26243e4cf49e5fe04789e4437e5e0f3f574Sundar Raman    p.set(TICameraParameters::KEY_GBCE, mCameraProperties->get(CameraProperties::GBCE));
3326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_S3D2D_PREVIEW, mCameraProperties->get(CameraProperties::S3D2D_PREVIEW));
3327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_AUTOCONVERGENCE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE));
3328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_MANUALCONVERGENCE_VALUES, mCameraProperties->get(CameraProperties::MANUALCONVERGENCE_VALUES));
33298b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu    p.set(CameraParameters::KEY_VIDEO_STABILIZATION, mCameraProperties->get(CameraProperties::VSTAB));
3330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_FOCAL_LENGTH, mCameraProperties->get(CameraProperties::FOCAL_LENGTH));
3331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::HOR_ANGLE));
3332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::VER_ANGLE));
3333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,mCameraProperties->get(CameraProperties::FRAMERATE_RANGE));
3334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION));
3335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_SENSOR_ORIENTATION_VALUES, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION_VALUES));
3336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MAKE, mCameraProperties->get(CameraProperties::EXIF_MAKE));
3337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(TICameraParameters::KEY_EXIF_MODEL, mCameraProperties->get(CameraProperties::EXIF_MODEL));
3338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_QUALITY));
3339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT, "OMX_TI_COLOR_FormatYUV420PackedSemiPlanar");
3340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, mCameraProperties->get(CameraProperties::MAX_FD_HW_FACES));
3341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, mCameraProperties->get(CameraProperties::MAX_FD_SW_FACES));
3342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // Only one area a.k.a Touch AF for now.
3344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // TODO: Add support for multiple focus areas.
3345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, mCameraProperties->get(CameraProperties::MAX_FOCUS_AREAS));
3346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK));
3347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK));
3348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    p.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS, mCameraProperties->get(CameraProperties::MAX_NUM_METERING_AREAS));
3349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Stop a previously started preview.
3355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
3357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::forceStopPreview()
3360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    // stop bracketing if it is running
3364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    stopImageBracketing();
3365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mDisplayAdapter.get() != NULL) {
3367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        ///Stop the buffer display first
3368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mDisplayAdapter->disableDisplay();
3369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if(mAppCallbackNotifier.get() != NULL) {
3372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        //Stop the callback sending
3373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stop();
337426d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu        mAppCallbackNotifier->flushAndReturnFrames();
3375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mAppCallbackNotifier->stopPreviewCallbacks();
3376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if ( NULL != mCameraAdapter ) {
3379342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        CameraAdapter::AdapterState currentState;
3380342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        CameraAdapter::AdapterState nextState;
3381aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
3382342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        currentState = mCameraAdapter->getState();
3383342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        nextState = mCameraAdapter->getNextState();
3384aa6e62e279cb54ae76c55ba9f8d02da230ce34e7Tyler Luu
3385342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // since prerequisite for capturing is for camera system
3386342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // to be previewing...cancel all captures before stopping
3387342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // preview
3388342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        if ( (currentState == CameraAdapter::CAPTURE_STATE) &&
3389342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu             (nextState != CameraAdapter::PREVIEW_STATE)) {
3390342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu            mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE);
3391342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
3392342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu
3393342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // only need to send these control commands to state machine if we are
3394342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // passed the LOADED_PREVIEW_STATE
3395342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        if (currentState > CameraAdapter::LOADED_PREVIEW_STATE) {
3396342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // according to javadoc...FD should be stopped in stopPreview
3397342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // and application needs to call startFaceDection again
3398342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           // to restart FD
3399342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD);
34002ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS);
3401342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
3402342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu
3403342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // only need to send these control commands to state machine if we are
3404342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        // passed the INITIALIZED_STATE
3405342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        if (currentState > CameraAdapter::INTIALIZED_STATE) {
3406342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           //Stop the source of frames
3407342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu           mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW);
3408342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu        }
3409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewBufs();
3412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    freePreviewDataBufs();
3413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mPreviewEnabled = false;
3415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mDisplayPaused = false;
3416342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu    mPreviewStartInProgress = false;
3417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/**
3422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @brief Deallocates memory for all the resources held by Camera HAL.
3423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter,
3425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   and Memory Manager
3426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @param none
3428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev   @return none
3429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */
3431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::deinitialize()
3432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3435f5094850dd99854af026e16bd21d8555a5168afbSundar Raman    if ( mPreviewEnabled || mDisplayPaused ) {
3436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        forceStopPreview();
3437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    mSetPreviewWindowCalled = false;
3440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    if (mSensorListener.get()) {
3442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION);
3443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener.clear();
3444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev        mSensorListener = NULL;
3445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    }
3446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::storeMetaDataInBuffers(bool enable)
3452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{
3453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME;
3454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    return mAppCallbackNotifier->useMetaDataBufferMode(enable);
3456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev    LOG_FUNCTION_NAME_EXIT;
3458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}
3459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3460a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boatengvoid CameraHal::selectFPSRange(int framerate, int *min_fps, int *max_fps)
3461a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng{
3462a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  char * ptr;
3463a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  char supported[MAX_PROP_VALUE_LENGTH];
3464a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  int fpsrangeArray[2];
3465a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  int i = 0;
3466a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3467a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  LOG_FUNCTION_NAME;
3468a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  size_t size = strlen(mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED))+1;
3469a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  strncpy(supported, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED), size);
3470a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3471a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  ptr = strtok (supported," (,)");
3472a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3473a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  while (ptr != NULL)
3474a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng    {
3475a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      fpsrangeArray[i]= atoi(ptr)/CameraHal::VFR_SCALE;
3476a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      if (i == 1)
3477a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng        {
3478a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng          if (framerate == fpsrangeArray[i])
3479a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng            {
3480a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              CAMHAL_LOGDB("SETTING FPS RANGE min = %d max = %d \n", fpsrangeArray[0], fpsrangeArray[1]);
3481d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman              *min_fps = fpsrangeArray[0]*CameraHal::VFR_SCALE;
3482d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman              *max_fps = fpsrangeArray[1]*CameraHal::VFR_SCALE;
3483a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng              break;
3484a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng            }
3485a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng        }
3486a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      ptr = strtok (NULL, " (,)");
3487a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      i++;
3488a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng      i%=2;
3489a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng    }
3490a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3491a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
3492a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
3493a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng}
3494a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng
349572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengvoid CameraHal::setPreferredPreviewRes(int width, int height)
349672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
349772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
349872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
349972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width == 320) && (height == 240)){
350072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParameters.setPreviewSize(640,480);
350172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
350272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width == 176) && (height == 144)){
350372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParameters.setPreviewSize(704,576);
350472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
350572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
350672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
350772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
350872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
350972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengvoid CameraHal::resetPreviewRes(CameraParameters *mParams, int width, int height)
351072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{
351172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME;
351272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
351372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  if ( (width <= 320) && (height <= 240)){
351472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng    mParams->setPreviewSize(mVideoWidth, mVideoHeight);
351572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  }
351672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
351772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng  LOG_FUNCTION_NAME_EXIT;
351872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng}
351972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng
3520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev};
3521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev
3523