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