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