CameraHal.cpp revision ffc1968e8c1188095c0d8d6b5379abdc7a06c9bd
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#include "CameraHal.h" 25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "ANativeWindowDisplayAdapter.h" 26f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#include "BufferSourceAdapter.h" 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "TICameraParameters.h" 28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "CameraProperties.h" 29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <cutils/properties.h> 30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <poll.h> 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <math.h> 33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 34f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Ti { 35f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsnamespace Camera { 36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 37f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsextern "C" CameraAdapter* OMXCameraAdapter_Factory(size_t); 38f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsextern "C" CameraAdapter* V4LCameraAdapter_Factory(size_t); 39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*****************************************************************************/ 41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev////Constant definitions and declarations 43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev////@todo Have a CameraProperties class to store these parameters as constants for every camera 44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//// Currently, they are hard-coded 45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst int CameraHal::NO_BUFFERS_PREVIEW = MAX_CAMERA_BUFFERS; 47f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsconst int CameraHal::NO_BUFFERS_IMAGE_CAPTURE = 5; 48f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsconst int CameraHal::SW_SCALING_FPS_LIMIT = 15; 49f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 50f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsconst uint32_t MessageNotifier::EVENT_BIT_FIELD_POSITION = 16; 51c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 52c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevconst uint32_t MessageNotifier::FRAME_BIT_FIELD_POSITION = 0; 53c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 54f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons// TODO(XXX): Temporarily increase number of buffers we can allocate from ANW 55f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons// until faux-NPA mode is implemented 56f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsconst int CameraHal::NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP = 15; 57f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 58f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING 59f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons// HACK: Default path to directory where RAW images coming from video port will be saved to. 60f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons// If directory not exists the saving is skipped and video port frame is ignored. 61f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons// The directory name is choosed in so weird way to enable RAW images saving only when 62f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons// directory has been created explicitly by user. 63f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsextern const char * const kRawImagesOutputDirPath = "/data/misc/camera/RaW_PiCtUrEs"; 64f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsextern const char * const kYuvImagesOutputDirPath = "/data/misc/camera/YuV_PiCtUrEs"; 65f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 66f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************************************************************/ 68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 69f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 70f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM 71f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic int dummy_update_and_get_buffer(preview_stream_ops_t*, buffer_handle_t**, int*) { 72f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return INVALID_OPERATION; 73f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 74f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 75f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic int dummy_get_buffer_dimension(preview_stream_ops_t*, int*, int*) { 76f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return INVALID_OPERATION; 77f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 78f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 79f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic int dummy_get_buffer_format(preview_stream_ops_t*, int*) { 80f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return INVALID_OPERATION; 81f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 82f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 83f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic int dummy_set_metadata(preview_stream_ops_t*, const camera_memory_t*) { 84f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return INVALID_OPERATION; 85f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 86f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 87f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic int dummy_get_id(preview_stream_ops_t*, char *data, unsigned int dataSize) { 88f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return INVALID_OPERATION; 89f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 901d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu 911d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luustatic int dummy_get_buffer_count(preview_stream_ops_t*, int *count) { 921d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu return INVALID_OPERATION; 931d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu} 94f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 95f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 96f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT 97f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatic preview_stream_extended_ops_t dummyPreviewStreamExtendedOps = { 98f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM 99f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons dummy_update_and_get_buffer, 100f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons dummy_get_buffer_dimension, 101f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons dummy_get_buffer_format, 102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons dummy_set_metadata, 103f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons dummy_get_id, 1041d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu dummy_get_buffer_count, 105f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 106f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons}; 107f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 108f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason SimmonsDisplayAdapter::DisplayAdapter() 111f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT 113f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mExtendedOps = &dummyPreviewStreamExtendedOps; 114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 115f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 116f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 117f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT 118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid DisplayAdapter::setExtendedOps(preview_stream_extended_ops_t * extendedOps) { 119f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mExtendedOps = extendedOps ? extendedOps : &dummyPreviewStreamExtendedOps; 120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 121f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 123f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartPreview; 128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartFocus; 129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstruct timeval CameraHal::mStartCapture; 130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void orientation_cb(uint32_t orientation, uint32_t tilt, void* cookie) { 134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHal *camera = NULL; 135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (cookie) { 137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera = (CameraHal*) cookie; 138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera->onOrientationEvent(orientation, tilt); 139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Interface Method definitions STARTS here--------------------*/ 144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Callback function to receive orientation events from SensorListener 147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::onOrientationEvent(uint32_t orientation, uint32_t tilt) { 149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mCameraAdapter ) { 152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter->onOrientationEvent(orientation, tilt); 153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Set the notification and data callbacks 160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] notify_cb Notify callback for notifying the app about events and errors 162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] data_cb Buffer callback for sending the preview/raw frames to the app 163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] data_cb_timestamp Buffer callback for sending the video frames w/ timestamp 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] user Callback cookie 165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return none 166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::setCallbacks(camera_notify_callback notify_cb, 169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_callback data_cb, 170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_data_timestamp_callback data_cb_timestamp, 171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev camera_request_memory get_memory, 172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev void *user) 173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mAppCallbackNotifier.get() ) 177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->setCallbacks(this, 179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev notify_cb, 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev data_cb, 181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev data_cb_timestamp, 182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev get_memory, 183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev user); 184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 186f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NULL != mCameraAdapter ) { 187f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapter->setSharedAllocator(get_memory); 188f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 189f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Enable a message, or set of messages. 195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] msgtype Bitmask of the messages to enable (defined in include/ui/Camera.h) 197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return none 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::enableMsgType(int32_t msgType) 201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( msgType & CAMERA_MSG_SHUTTER ) && ( !mShutterEnabled ) ) 205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msgType &= ~CAMERA_MSG_SHUTTER; 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2092ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu // ignoring enable focus message from camera service 2102ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu // we will enable internally in autoFocus call 211f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons msgType &= ~CAMERA_MSG_FOCUS; 212f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef ANDROID_API_JB_OR_LATER 213f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons msgType &= ~CAMERA_MSG_FOCUS_MOVE; 214f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 2152ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 217f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMsgEnabled |= msgType; 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mDisplayPaused) 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Preview currently paused...will enable preview callback when restarted"); 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev msgType &= ~CAMERA_MSG_PREVIEW_FRAME; 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }else 228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Enabling Preview Callback"); 230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Preview callback not enabled %x", msgType); 235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Configure app callback notifier with the message callback required 239c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->enableMsgType (msgType); 240c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Disable a message, or set of messages. 246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] msgtype Bitmask of the messages to disable (defined in include/ui/Camera.h) 248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return none 249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::disableMsgType(int32_t msgType) 252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 256f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMsgEnabled &= ~msgType; 258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 259c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( msgType & CAMERA_MSG_PREVIEW_FRAME) 261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Disabling Preview Callback"); 263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Configure app callback notifier 266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->disableMsgType (msgType); 267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Query whether a message, or a set of messages, is enabled. 273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Note that this is operates as an AND, if any of the messages queried are off, this will 275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return false. 276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] msgtype Bitmask of the messages to query (defined in include/ui/Camera.h) 278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return true If all message types are enabled 279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev false If any message type 280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::msgTypeEnabled(int32_t msgType) 283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int32_t msgEnabled = 0; 285f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 287f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 288f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 289f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons msgEnabled = mMsgEnabled; 290f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!previewEnabled() && !mPreviewInitializationDone) { 291f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons msgEnabled &= ~(CAMERA_MSG_PREVIEW_FRAME | CAMERA_MSG_PREVIEW_METADATA); 292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 295f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return (msgEnabled & msgType); 296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Set the camera parameters. 300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] params Camera parameters to configure the camera 302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR 303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Define error codes 304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::setParameters(const char* parameters) 307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 309f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 311f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters params; 312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 313f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::String8 str_params(parameters); 314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev params.unflatten(str_params); 315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return setParameters(params); 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Set the camera parameters. 323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] params Camera parameters to configure the camera 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Define error codes 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 329f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsint CameraHal::setParameters(const android::CameraParameters& params) 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 332f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int w, h; 335f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int framerate; 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int maxFPS, minFPS; 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *valstr = NULL; 338a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev int varint = 0; 339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 340b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // Needed for KEY_RECORDING_HINT 341b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil bool restartPreviewRequired = false; 342f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu bool updateRequired = false; 343f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters oldParams = mParameters; 344f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 345f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef V4L_CAMERA_ADAPTER 346f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp (V4L_CAMERA_NAME_USB, mCameraProperties->get(CameraProperties::CAMERA_NAME)) == 0 ) { 347f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons updateRequired = true; 348f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 349f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 351b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 352f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 354b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil ///Ensure that preview is not enabled when the below parameters are changed. 355b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if(!previewEnabled()) 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3573a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu if ((valstr = params.getPreviewFormat()) != NULL) { 3583a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS))) { 3593a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu mParameters.setPreviewFormat(valstr); 360f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("PreviewFormat set %s", valstr); 3613a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu } else { 362f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Invalid preview format: %s. Supported: %s", valstr, 363f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS)); 364a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 365b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 3663a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu } 367b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 368f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(TICameraParameters::KEY_VNF)) != NULL) { 369f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(mCameraProperties->get(CameraProperties::VNF_SUPPORTED), 370f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::TRUE) == 0) { 371f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("VNF %s", valstr); 372f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_VNF, valstr); 373f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) { 374f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid VNF: %s", valstr); 375a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 376f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 377f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_VNF, 378f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::FALSE); 379b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 380f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 381b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 382f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) != NULL) { 3838b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu // make sure we support vstab...if we don't and application is trying to set 3848b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu // vstab then return an error 3858b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED), 386f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::TRUE) == 0) { 387f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("VSTAB %s", valstr); 388f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION, valstr); 389f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) { 390f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid VSTAB: %s", valstr); 391a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 3928b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu } else { 393f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION, 394f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::FALSE); 395b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 396f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 397b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 398f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(TICameraParameters::KEY_CAP_MODE)) != NULL) { 399a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 400f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(TICameraParameters::VIDEO_MODE, valstr)) { 401f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapModeBackup = valstr; 402f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 403a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 404f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Capture mode set %s", valstr); 405b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 406f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons const char *currentMode = mParameters.get(TICameraParameters::KEY_CAP_MODE); 407f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NULL != currentMode ) { 408f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( strcmp(currentMode, valstr) != 0 ) { 409f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons updateRequired = true; 410f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 411f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 412f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons updateRequired = true; 413f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 414f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 415f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_CAP_MODE, valstr); 416f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (!mCapModeBackup.isEmpty()) { 417f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Restore previous capture mode after stopPreview() 418f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_CAP_MODE, 419f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapModeBackup.string()); 420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons updateRequired = true; 421f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 422f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 423f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC 424f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(TICameraParameters::KEY_VTC_HINT)) != NULL ) { 425f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_VTC_HINT, valstr); 426f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(valstr, android::CameraParameters::TRUE) == 0) { 427f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVTCUseCase = true; 428f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 429f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVTCUseCase = false; 430b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 431f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("VTC Hint = %d", mVTCUseCase); 432f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 433b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 434f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mVTCUseCase) { 435f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE)) != NULL ) { 436f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE, valstr); 437b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 438b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT)) != NULL ) { 440f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT, valstr); 441b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 442b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 443f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 444f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 445b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(TICameraParameters::KEY_IPP)) != NULL) { 447f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES))) { 44859f5191dd90015ae76ee25956eee5bd5917ba34eAndriy Chepurnyy if ((mParameters.get(TICameraParameters::KEY_IPP) == NULL) || 44959f5191dd90015ae76ee25956eee5bd5917ba34eAndriy Chepurnyy (strcmp(valstr, mParameters.get(TICameraParameters::KEY_IPP)))) { 450f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("IPP mode set %s", params.get(TICameraParameters::KEY_IPP)); 451f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_IPP, valstr); 452f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons restartPreviewRequired = true; 4533a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu } 454f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 455f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("ERROR: Invalid IPP mode: %s", valstr); 456a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 457f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 458f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 459f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 460f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (valstr = params.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT)) != NULL ) 461f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 462f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(valstr, mParameters.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT))) 4633a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu { 464f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Stereo 3D preview image layout is %s", valstr); 465f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT, valstr); 466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons restartPreviewRequired = true; 4673a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu } 468f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4693a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu 470f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT 471f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int orientation =0; 472f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if((valstr = params.get(TICameraParameters::KEY_SENSOR_ORIENTATION)) != NULL) 473f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 474f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons doesSetParameterNeedUpdate(valstr, 475f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.get(TICameraParameters::KEY_SENSOR_ORIENTATION), 476f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons updateRequired); 477a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 478f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons orientation = params.getInt(TICameraParameters::KEY_SENSOR_ORIENTATION); 479f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( orientation < 0 || orientation >= 360 || (orientation%90) != 0 ) { 480f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Invalid sensor orientation: %s. Value must be one of: [0, 90, 180, 270]", valstr); 481f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 482f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 483a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 484f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Sensor Orientation is set to %d", orientation); 485f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_SENSOR_ORIENTATION, valstr); 486f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 487a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif 488a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 489f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons params.getPreviewSize(&w, &h); 490f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (w == -1 && h == -1) { 491f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Unable to get preview size"); 492f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 493a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev } 494a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 495f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoWidth = w; 496f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoHeight = h; 4973a1541be51a8cc8dcc92a4ea1f0fa4a1c80990ceTyler Luu 498b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // Handle RECORDING_HINT to Set/Reset Video Mode Parameters 499f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = params.get(android::CameraParameters::KEY_RECORDING_HINT); 500b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if(valstr != NULL) 501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 502f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Recording Hint is set to %s", valstr); 503f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(strcmp(valstr, android::CameraParameters::TRUE) == 0) 504b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 505f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGVB("Video Resolution: %d x %d", mVideoWidth, mVideoHeight); 506f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC 507f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!mVTCUseCase) 508f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 509f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 510f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int maxFPS, minFPS; 51172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 512f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons params.getPreviewFpsRange(&minFPS, &maxFPS); 513f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons maxFPS /= CameraHal::VFR_SCALE; 514f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( ( maxFPS <= SW_SCALING_FPS_LIMIT ) ) { 515f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons getPreferredPreviewRes(&w, &h); 516f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 517f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 518f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, valstr); 5193dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng restartPreviewRequired |= setVideoModeParameters(params); 520b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 521f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons else if(strcmp(valstr, android::CameraParameters::FALSE) == 0) 522b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 523f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, valstr); 524ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu restartPreviewRequired |= resetVideoModeParameters(); 525b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 526b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil else 527b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 528b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGEA("Invalid RECORDING_HINT"); 529a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 530b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 534b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // This check is required in following case. 535b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // If VideoRecording activity sets KEY_RECORDING_HINT to TRUE and 536b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // ImageCapture activity doesnot set KEY_RECORDING_HINT to FALSE (i.e. simply NULL), 537b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // then Video Mode parameters may remain present in ImageCapture activity as well. 538b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGDA("Recording Hint is set to NULL"); 539f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_RECORDING_HINT, ""); 540ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu restartPreviewRequired |= resetVideoModeParameters(); 541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 543f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES))) 544f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SUBSAMPLED_SIZES))) 545f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES))) 546f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons && (!isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_TOPBOTTOM_SIZES))) ) { 547f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Invalid preview resolution %d x %d", w, h); 548f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 549f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 550f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 551f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int oldWidth, oldHeight; 552f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.getPreviewSize(&oldWidth, &oldHeight); 553f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( ( oldWidth != w ) || ( oldHeight != h ) ) 554f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 555f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.setPreviewSize(w, h); 556f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons restartPreviewRequired = true; 557f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 558f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 559f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Preview Resolution: %d x %d", w, h); 560f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 561f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(android::CameraParameters::KEY_FOCUS_MODE)) != NULL) { 5629743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES))) { 563a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("Focus mode set %s", valstr); 5649743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu 5659743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu // we need to take a decision on the capture mode based on whether CAF picture or 5669743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu // video is chosen so the behavior of each is consistent to the application 567f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0){ 5689743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu restartPreviewRequired |= resetVideoModeParameters(); 569f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) == 0){ 5709743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu restartPreviewRequired |= setVideoModeParameters(params); 5719743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu } 5729743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu 573f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_FOCUS_MODE, valstr); 5749743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu } else { 5759743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu CAMHAL_LOGEB("ERROR: Invalid FOCUS mode = %s", valstr); 576a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 5779743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu } 5789743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu } 5799743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu 580f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mRawCapture = false; 581f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 582f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING 583f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = params.get(TICameraParameters::KEY_CAP_MODE); 584f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (!valstr || strcmp(valstr, TICameraParameters::HIGH_QUALITY_MODE) == 0) && 585f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons access(kRawImagesOutputDirPath, F_OK) != -1 ) { 586f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mRawCapture = true; 587a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev } 588f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 589f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 590f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (valstr = params.get(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT)) != NULL ) 591f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 592f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Stereo 3D capture image layout is %s", valstr); 593f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT, valstr); 594f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 596b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil params.getPictureSize(&w, &h); 597f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES))) 598f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SUBSAMPLED_SIZES))) 599f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_TOPBOTTOM_SIZES))) 600f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons || (isResolutionValid(w, h, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIDEBYSIDE_SIZES))) ) { 601b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.setPictureSize(w, h); 602f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 603f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("ERROR: Invalid picture resolution %d x %d", w, h); 604a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 605f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 607b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGDB("Picture Size by App %d x %d", w, h); 608b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 609f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (valstr = params.getPictureFormat()) != NULL ) { 610f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (isParameterValid(valstr,mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS))) { 611f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((strcmp(valstr, android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB) == 0) && 612f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraProperties->get(CameraProperties::MAX_PICTURE_WIDTH) && 613f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraProperties->get(CameraProperties::MAX_PICTURE_HEIGHT)) { 614f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons unsigned int width = 0, height = 0; 615f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Set picture size to full frame for raw bayer capture 616f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons width = atoi(mCameraProperties->get(CameraProperties::MAX_PICTURE_WIDTH)); 617f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons height = atoi(mCameraProperties->get(CameraProperties::MAX_PICTURE_HEIGHT)); 618f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.setPictureSize(width,height); 619f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 620f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.setPictureFormat(valstr); 621f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 622f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("ERROR: Invalid picture format: %s",valstr); 623f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = BAD_VALUE; 624f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 625f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 626a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 627f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_BURST_CAPTURE 628f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if ((valstr = params.get(TICameraParameters::KEY_BURST)) != NULL) { 629f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if (params.getInt(TICameraParameters::KEY_BURST) >=0) { 630a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("Burst set %s", valstr); 631f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu mParameters.set(TICameraParameters::KEY_BURST, valstr); 632f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 633f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid Burst value: %s",valstr); 634a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 636f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 637a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif 638a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 6391521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu // Variable framerate ranges have higher priority over 6401521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu // deprecated constant FPS. "KEY_PREVIEW_FPS_RANGE" should 6411521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu // be cleared by the client in order for constant FPS to get 6421521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu // applied. 643f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // If Port FPS needs to be used for configuring, then FPS RANGE should not be set by the APP. 644f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = params.get(android::CameraParameters::KEY_PREVIEW_FPS_RANGE); 645f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valstr != NULL && strlen(valstr)) { 646f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int curMaxFPS = 0; 647f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int curMinFPS = 0; 648f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 649524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman // APP wants to set FPS range 650f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Set framerate = MAXFPS 651524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman CAMHAL_LOGDA("APP IS CHANGING FRAME RATE RANGE"); 652d1e16379476a175660ef8f6934c289edeed6b7fcSundar Raman 653f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.getPreviewFpsRange(&curMinFPS, &curMaxFPS); 654f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("## current minFPS = %d; maxFPS=%d",curMinFPS, curMaxFPS); 655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 656f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons params.getPreviewFpsRange(&minFPS, &maxFPS); 657f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("## requested minFPS = %d; maxFPS=%d",minFPS, maxFPS); 658f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Validate VFR 659f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!isFpsRangeValid(minFPS, maxFPS, params.get(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE)) && 660f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons !isFpsRangeValid(minFPS, maxFPS, params.get(TICameraParameters::KEY_FRAMERATE_RANGES_EXT_SUPPORTED))) { 661f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Invalid FPS Range"); 662f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 663f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 664f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons framerate = maxFPS / CameraHal::VFR_SCALE; 665f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.setPreviewFrameRate(framerate); 666f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("SET FRAMERATE %d", framerate); 667f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, valstr); 668f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("FPS Range = %s", valstr); 669f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( curMaxFPS == (FRAME_RATE_HIGH_HD * CameraHal::VFR_SCALE) && 670f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons maxFPS < (FRAME_RATE_HIGH_HD * CameraHal::VFR_SCALE) ) { 671f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons restartPreviewRequired = true; 672524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman } 673f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 674f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 675f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons framerate = params.getPreviewFrameRate(); 676f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!isParameterValid(framerate, params.get(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES)) && 677f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons !isParameterValid(framerate, params.get(TICameraParameters::KEY_FRAMERATES_EXT_SUPPORTED))) { 678f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Invalid frame rate"); 679f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 680f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 681f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons char tmpBuffer[MAX_PROP_VALUE_LENGTH]; 682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 683f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons sprintf(tmpBuffer, "%d,%d", framerate * CameraHal::VFR_SCALE, framerate * CameraHal::VFR_SCALE); 684f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.setPreviewFrameRate(framerate); 685f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("SET FRAMERATE %d", framerate); 686f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, tmpBuffer); 687f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("FPS Range = %s", tmpBuffer); 688f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 690f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(TICameraParameters::KEY_GBCE)) != NULL) { 691f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(mCameraProperties->get(CameraProperties::SUPPORTED_GBCE), 692f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::TRUE) == 0) { 693f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("GBCE %s", valstr); 694f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_GBCE, valstr); 695f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) { 696f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("ERROR: Invalid GBCE: %s", valstr); 697f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 698f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 699f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_GBCE, android::CameraParameters::FALSE); 700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 701f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 702f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_GBCE, android::CameraParameters::FALSE); 703f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 705f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(TICameraParameters::KEY_GLBCE)) != NULL) { 706f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(mCameraProperties->get(CameraProperties::SUPPORTED_GLBCE), 707f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::TRUE) == 0) { 708f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("GLBCE %s", valstr); 709f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_GLBCE, valstr); 710f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (strcmp(valstr, android::CameraParameters::TRUE) == 0) { 711f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("ERROR: Invalid GLBCE: %s", valstr); 712f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 713f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 714f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_GLBCE, android::CameraParameters::FALSE); 715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 716f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 717f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_GLBCE, android::CameraParameters::FALSE); 718f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 720f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_S3D 721b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil ///Update the current parameter set 722f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (valstr = params.get(TICameraParameters::KEY_AUTOCONVERGENCE_MODE)) != NULL ) { 723f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("AutoConvergence mode set = %s", valstr); 724f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, valstr); 725f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 726f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 727f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (valstr = params.get(TICameraParameters::KEY_MANUAL_CONVERGENCE)) != NULL ) { 728f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int manualConvergence = (int)strtol(valstr, 0, 0); 729f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 730f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( ( manualConvergence < strtol(mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MIN), 0, 0) ) || 731f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ( manualConvergence > strtol(mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MAX), 0, 0) ) ) { 732f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("ERROR: Invalid Manual Convergence = %d", manualConvergence); 733f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 734f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 735f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("ManualConvergence Value = %d", manualConvergence); 736f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_MANUAL_CONVERGENCE, valstr); 7371521831b2b2db93a1c90dd960ca4ee56b65de03dTyler Luu } 738f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 740f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if((valstr = params.get(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION)) != NULL) { 741f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( strcmp(mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED), 742f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::TRUE) == 0 ) { 743f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Mechanical Mialignment Correction is %s", valstr); 744f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION, valstr); 745f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 746f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION); 747b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 748f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 750f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if ((valstr = params.get(TICameraParameters::KEY_EXPOSURE_MODE)) != NULL) { 751f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES))) { 752f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Exposure mode set = %s", valstr); 753f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu mParameters.set(TICameraParameters::KEY_EXPOSURE_MODE, valstr); 754f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!strcmp(valstr, TICameraParameters::EXPOSURE_MODE_MANUAL)) { 755f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int manualVal; 756f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(TICameraParameters::KEY_MANUAL_EXPOSURE)) != NULL) { 757f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons manualVal = params.getInt(TICameraParameters::KEY_MANUAL_EXPOSURE); 758f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN) || 759f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX)) { 760f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("ERROR: Manual Exposure = %s is out of range - " 761f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons "setting minimum supported value", valstr); 762f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN); 763f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 764f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Manual Exposure = %s", valstr); 765f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_MANUAL_EXPOSURE, valstr); 766f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 767f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT)) != NULL) { 768f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons manualVal = params.getInt(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT); 769f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN) || 770f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX)) { 771f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("ERROR: Manual Exposure right = %s is out of range - " 772f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons "setting minimum supported value", valstr); 773f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN); 774f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 775f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Manual Exposure right = %s", valstr); 776f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT, valstr); 777f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 778f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(TICameraParameters::KEY_MANUAL_GAIN_ISO)) != NULL) { 779f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons manualVal = params.getInt(TICameraParameters::KEY_MANUAL_GAIN_ISO); 780f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN) || 781f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX)) { 782f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("ERROR: Manual Gain = %s is out of range - " 783f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons "setting minimum supported value", valstr); 784f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN); 785f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 786f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Manual Gain = %s", valstr); 787f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_MANUAL_GAIN_ISO, valstr); 788f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 789f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT)) != NULL) { 790f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons manualVal = params.getInt(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT); 791f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (manualVal < mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN) || 792f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons manualVal > mParameters.getInt(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX)) { 793f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("ERROR: Manual Gain right = %s is out of range - " 794f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons "setting minimum supported value", valstr); 795f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = mParameters.get(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN); 796f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 797f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Manual Gain right = %s", valstr); 798f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT, valstr); 799f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 800f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 801f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 802f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("ERROR: Invalid Exposure mode = %s", valstr); 803a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 804b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 805f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 806a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif 807a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 808f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(android::CameraParameters::KEY_WHITE_BALANCE)) != NULL) { 809f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if ( isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE))) { 810f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGDB("White balance set %s", valstr); 811f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_WHITE_BALANCE, valstr); 812f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 813f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid white balance = %s", valstr); 814a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 815b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 816f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 818a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT 819f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if ((valstr = params.get(TICameraParameters::KEY_CONTRAST)) != NULL) { 820f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if (params.getInt(TICameraParameters::KEY_CONTRAST) >= 0 ) { 821f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGDB("Contrast set %s", valstr); 822f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu mParameters.set(TICameraParameters::KEY_CONTRAST, valstr); 823f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 824f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid Contrast = %s", valstr); 825a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 826b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 827f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 829f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if ((valstr =params.get(TICameraParameters::KEY_SHARPNESS)) != NULL) { 830f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if (params.getInt(TICameraParameters::KEY_SHARPNESS) >= 0 ) { 831f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGDB("Sharpness set %s", valstr); 832f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu mParameters.set(TICameraParameters::KEY_SHARPNESS, valstr); 833f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 834f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid Sharpness = %s", valstr); 835a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 836b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 837f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 839f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if ((valstr = params.get(TICameraParameters::KEY_SATURATION)) != NULL) { 840f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if (params.getInt(TICameraParameters::KEY_SATURATION) >= 0 ) { 841f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGDB("Saturation set %s", valstr); 842f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu mParameters.set(TICameraParameters::KEY_SATURATION, valstr); 843f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 844f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid Saturation = %s", valstr); 845a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 846b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 847f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 849f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if ((valstr = params.get(TICameraParameters::KEY_BRIGHTNESS)) != NULL) { 850f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if (params.getInt(TICameraParameters::KEY_BRIGHTNESS) >= 0 ) { 851f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGDB("Brightness set %s", valstr); 852f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu mParameters.set(TICameraParameters::KEY_BRIGHTNESS, valstr); 853f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 854f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid Brightness = %s", valstr); 855a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 856f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 857f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 858a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif 859a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 860f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(android::CameraParameters::KEY_ANTIBANDING)) != NULL) { 861f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING))) { 862f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGDB("Antibanding set %s", valstr); 863f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_ANTIBANDING, valstr); 864f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 865f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid Antibanding = %s", valstr); 866a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 867f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 868f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 869f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu 870a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT 871f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if ((valstr = params.get(TICameraParameters::KEY_ISO)) != NULL) { 872f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES))) { 873f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGDB("ISO set %s", valstr); 874f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu mParameters.set(TICameraParameters::KEY_ISO, valstr); 875f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 876f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid ISO = %s", valstr); 877a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 878b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 879f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 880a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif 881a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 882f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(android::CameraParameters::KEY_FOCUS_AREAS)) != NULL ) 883b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 884f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Focus areas position set %s", params.get(android::CameraParameters::KEY_FOCUS_AREAS)); 885f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_FOCUS_AREAS, valstr); 886b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 888a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT 889b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if( (valstr = params.get(TICameraParameters::KEY_MEASUREMENT_ENABLE)) != NULL ) 890b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 891f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Measurements set to %s", valstr); 892b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.set(TICameraParameters::KEY_MEASUREMENT_ENABLE, valstr); 893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 894f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(valstr, android::CameraParameters::TRUE) == 0) 895b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 896b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mMeasurementEnabled = true; 897b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 898f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons else if (strcmp(valstr, android::CameraParameters::FALSE) == 0) 899b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 900b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mMeasurementEnabled = false; 901b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 902b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil else 903b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 904b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mMeasurementEnabled = false; 905b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 907b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 908a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif 909a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 910f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(android::CameraParameters::KEY_EXPOSURE_COMPENSATION)) != NULL) 911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 912f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Exposure compensation set %s", params.get(android::CameraParameters::KEY_EXPOSURE_COMPENSATION)); 913f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION, valstr); 914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 915b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 916f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(android::CameraParameters::KEY_SCENE_MODE)) != NULL) { 917f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES))) { 918f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGDB("Scene mode set %s", valstr); 919759396a116bb2caf006405777a626fe9a8708114Tyler Luu doesSetParameterNeedUpdate(valstr, 920f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.get(android::CameraParameters::KEY_SCENE_MODE), 921759396a116bb2caf006405777a626fe9a8708114Tyler Luu updateRequired); 922f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_SCENE_MODE, valstr); 923f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 924f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid Scene mode = %s", valstr); 925a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 927f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 928b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 929f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(android::CameraParameters::KEY_FLASH_MODE)) != NULL) { 930f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES))) { 931f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGDB("Flash mode set %s", valstr); 932f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_FLASH_MODE, valstr); 933f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 934f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid Flash mode = %s", valstr); 935a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 937f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 939f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(android::CameraParameters::KEY_EFFECT)) != NULL) { 940f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu if (isParameterValid(valstr, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS))) { 941f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGDB("Effect set %s", valstr); 942f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_EFFECT, valstr); 943f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 944f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid Effect = %s", valstr); 945a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 946f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 947f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 949f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons varint = params.getInt(android::CameraParameters::KEY_ROTATION); 950f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( varint >= 0 ) { 951a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("Rotation set %d", varint); 952f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_ROTATION, varint); 953f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 955f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons varint = params.getInt(android::CameraParameters::KEY_JPEG_QUALITY); 956f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( varint >= 0 ) { 957a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("Jpeg quality set %d", varint); 958f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_JPEG_QUALITY, varint); 959f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 961f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH); 962f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( varint >= 0 ) { 963a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("Thumbnail width set %d", varint); 964f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, varint); 965f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 967f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT); 968f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( varint >= 0 ) { 969a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("Thumbnail width set %d", varint); 970f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, varint); 971f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 973f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons varint = params.getInt(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY); 974f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( varint >= 0 ) { 975a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("Thumbnail quality set %d", varint); 976f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, varint); 977f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 979f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(android::CameraParameters::KEY_GPS_LATITUDE)) != NULL ) 980b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 981f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("GPS latitude set %s", params.get(android::CameraParameters::KEY_GPS_LATITUDE)); 982f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_GPS_LATITUDE, valstr); 983b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil }else{ 984f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(android::CameraParameters::KEY_GPS_LATITUDE); 985b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 987f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(android::CameraParameters::KEY_GPS_LONGITUDE)) != NULL ) 988b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 989f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("GPS longitude set %s", params.get(android::CameraParameters::KEY_GPS_LONGITUDE)); 990f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_GPS_LONGITUDE, valstr); 991b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil }else{ 992f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(android::CameraParameters::KEY_GPS_LONGITUDE); 993b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 995f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(android::CameraParameters::KEY_GPS_ALTITUDE)) != NULL ) 996b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 997f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("GPS altitude set %s", params.get(android::CameraParameters::KEY_GPS_ALTITUDE)); 998f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_GPS_ALTITUDE, valstr); 999b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil }else{ 1000f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(android::CameraParameters::KEY_GPS_ALTITUDE); 1001b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1003f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(android::CameraParameters::KEY_GPS_TIMESTAMP)) != NULL ) 1004b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1005f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("GPS timestamp set %s", params.get(android::CameraParameters::KEY_GPS_TIMESTAMP)); 1006f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_GPS_TIMESTAMP, valstr); 1007b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil }else{ 1008f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(android::CameraParameters::KEY_GPS_TIMESTAMP); 1009b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1011b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if( (valstr = params.get(TICameraParameters::KEY_GPS_DATESTAMP)) != NULL ) 1012b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1013a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("GPS datestamp set %s", valstr); 1014b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.set(TICameraParameters::KEY_GPS_DATESTAMP, valstr); 1015b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil }else{ 1016b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.remove(TICameraParameters::KEY_GPS_DATESTAMP); 1017b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1019f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(android::CameraParameters::KEY_GPS_PROCESSING_METHOD)) != NULL ) 1020b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1021f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("GPS processing method set %s", params.get(android::CameraParameters::KEY_GPS_PROCESSING_METHOD)); 1022f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_GPS_PROCESSING_METHOD, valstr); 1023b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil }else{ 1024f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(android::CameraParameters::KEY_GPS_PROCESSING_METHOD); 1025b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1027b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if( (valstr = params.get(TICameraParameters::KEY_GPS_MAPDATUM )) != NULL ) 1028b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1029a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr); 1030b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.set(TICameraParameters::KEY_GPS_MAPDATUM, valstr); 1031b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil }else{ 1032b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.remove(TICameraParameters::KEY_GPS_MAPDATUM); 1033b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1035b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if( (valstr = params.get(TICameraParameters::KEY_GPS_VERSION)) != NULL ) 1036b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1037a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("GPS MAPDATUM set %s", valstr); 1038b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.set(TICameraParameters::KEY_GPS_VERSION, valstr); 1039b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil }else{ 1040b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.remove(TICameraParameters::KEY_GPS_VERSION); 1041b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1043b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if( (valstr = params.get(TICameraParameters::KEY_EXIF_MODEL)) != NULL ) 1044b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1045a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("EXIF Model set %s", valstr); 1046b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.set(TICameraParameters::KEY_EXIF_MODEL, valstr); 1047b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1049b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if( (valstr = params.get(TICameraParameters::KEY_EXIF_MAKE)) != NULL ) 1050b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1051a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("EXIF Make set %s", valstr); 1052b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.set(TICameraParameters::KEY_EXIF_MAKE, valstr); 1053b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1055a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#ifdef OMAP_ENHANCEMENT 1056b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if( (valstr = params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)) != NULL ) 1057b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1058b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGDB("Exposure Bracketing set %s", params.get(TICameraParameters::KEY_EXP_BRACKETING_RANGE)); 1059b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valstr); 1060f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE); 1061b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1062f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons else if ((valstr = params.get(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE)) != NULL) { 1063f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("ABS Exposure+Gain Bracketing set %s", params.get(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE)); 1064f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE, valstr); 1065f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE); 1066f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else 1067b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1068b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE); 1069b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1071f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE)) != NULL ) { 1072f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Zoom Bracketing range %s", valstr); 1073f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE, valstr); 1074f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 1075f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(TICameraParameters::KEY_ZOOM_BRACKETING_RANGE); 1076f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1077a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif 1078a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 1079f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr = params.get(android::CameraParameters::KEY_ZOOM)) != NULL ) { 1080f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons varint = atoi(valstr); 1081f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( varint >= 0 && varint <= mMaxZoomSupported ) { 1082f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Zoom set %d", varint); 1083f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu doesSetParameterNeedUpdate(valstr, 1084f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.get(android::CameraParameters::KEY_ZOOM), 1085f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu updateRequired); 1086f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_ZOOM, valstr); 1087f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } else { 1088f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu CAMHAL_LOGEB("ERROR: Invalid Zoom: %s", valstr); 1089a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev return BAD_VALUE; 1090b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1091f8a04b91f608ec0edf05c34e6f105d08175218c5Tyler Luu } 1092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1093f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK)) != NULL ) 1094b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1095a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("Auto Exposure Lock set %s", valstr); 1096f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu doesSetParameterNeedUpdate(valstr, 1097f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.get(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK), 1098f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu updateRequired); 1099f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK, valstr); 1100b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) != NULL ) 1103b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1104a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev CAMHAL_LOGDB("Auto WhiteBalance Lock set %s", valstr); 1105f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu doesSetParameterNeedUpdate(valstr, 1106f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.get(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK), 1107f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu updateRequired); 1108f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, valstr); 1109b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(android::CameraParameters::KEY_METERING_AREAS)) != NULL ) 1111708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev { 1112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Metering areas position set %s", params.get(android::CameraParameters::KEY_METERING_AREAS)); 1113f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_METERING_AREAS, valstr); 1114708ed7306c85286aa50d05ba15e0c33106e52ed0Iliyan Malchev } 1115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1116f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(TICameraParameters::RAW_WIDTH)) != NULL ) { 1117f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Raw image width set %s", params.get(TICameraParameters::RAW_WIDTH)); 1118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::RAW_WIDTH, valstr); 1119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1121f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(TICameraParameters::RAW_HEIGHT)) != NULL ) { 1122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Raw image height set %s", params.get(TICameraParameters::RAW_HEIGHT)); 1123f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::RAW_HEIGHT, valstr); 1124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1125a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev 1126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons //TI extensions for enable/disable algos 1127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(TICameraParameters::KEY_ALGO_FIXED_GAMMA)) != NULL ) 1128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Fixed Gamma set %s", valstr); 1130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_ALGO_FIXED_GAMMA, valstr); 1131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1133f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(TICameraParameters::KEY_ALGO_NSF1)) != NULL ) 1134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 1135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("NSF1 set %s", valstr); 1136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_ALGO_NSF1, valstr); 1137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(TICameraParameters::KEY_ALGO_NSF2)) != NULL ) 1140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 1141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("NSF2 set %s", valstr); 1142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_ALGO_NSF2, valstr); 1143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(TICameraParameters::KEY_ALGO_SHARPENING)) != NULL ) 1146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 1147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Sharpening set %s", valstr); 1148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_ALGO_SHARPENING, valstr); 1149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(TICameraParameters::KEY_ALGO_THREELINCOLORMAP)) != NULL ) 1152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 1153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Color Conversion set %s", valstr); 1154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_ALGO_THREELINCOLORMAP, valstr); 1155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( (valstr = params.get(TICameraParameters::KEY_ALGO_GIC)) != NULL ) 1158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 1159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Green Inballance Correction set %s", valstr); 1160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_ALGO_GIC, valstr); 1161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters adapterParams = mParameters; 1164f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1165f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT 1166f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS) ) 1167f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 1168f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int posBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_POS); 1169f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( 0 < posBracketRange ) 1170f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 1171f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mBracketRangePositive = posBracketRange; 1172f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1173f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1174f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Positive bracketing range %d", mBracketRangePositive); 1175f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1176f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1177f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( NULL != params.get(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG) ) 1178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1179b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil int negBracketRange = params.getInt(TICameraParameters::KEY_TEMP_BRACKETING_RANGE_NEG); 1180b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if ( 0 < negBracketRange ) 1181b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1182b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mBracketRangeNegative = negBracketRange; 1183b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1185b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGDB("Negative bracketing range %d", mBracketRangeNegative); 1186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1187b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL) && 1188f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ( strcmp(valstr, android::CameraParameters::TRUE) == 0 )) { 1189f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( !mBracketingEnabled ) { 1190b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGDA("Enabling bracketing"); 1191b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mBracketingEnabled = true; 1192f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 1193b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGDA("Bracketing already enabled"); 1194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1195f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons adapterParams.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr); 1196f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr); 1197f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if ( ( (valstr = params.get(TICameraParameters::KEY_TEMP_BRACKETING)) != NULL ) && 1198f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ( strcmp(valstr, android::CameraParameters::FALSE) == 0 )) { 1199b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGDA("Disabling bracketing"); 1200b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 1201f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons adapterParams.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr); 1202f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_TEMP_BRACKETING, valstr); 1203b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mBracketingEnabled = false; 1204f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( mBracketingRunning ) { 1205f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons stopImageBracketing(); 1206f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1207b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 1208f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 1209f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons adapterParams.remove(TICameraParameters::KEY_TEMP_BRACKETING); 1210f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(TICameraParameters::KEY_TEMP_BRACKETING); 1211f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1212f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 1213b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 1214f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC 1215f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mVTCUseCase && !mTunnelSetup && (mCameraAdapter != NULL) && 1216f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ((mParameters.get(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE)) != NULL )&& 1217f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ((mParameters.get(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT)) != NULL )) { 1218f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1219f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons uint32_t sliceHeight = mParameters.getInt(TICameraParameters::KEY_VIDEO_ENCODER_SLICE_HEIGHT); 1220f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons uint32_t encoderHandle = mParameters.getInt(TICameraParameters::KEY_VIDEO_ENCODER_HANDLE); 1221f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int w, h; 1222f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.getPreviewSize(&w, &h); 1223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t done = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SETUP_TUNNEL, sliceHeight, encoderHandle, w, h); 1224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (done == NO_ERROR) mTunnelSetup = true; 1225f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret |= done; 1226f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 1228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1229f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Only send parameters to adapter if preview is already 1230f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // enabled or doesSetParameterNeedUpdate says so. Initial setParameters to camera adapter, 1231f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // will be called in startPreview() 1232f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // TODO(XXX): Need to identify other parameters that need update from camera adapter 1233f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (NULL != mCameraAdapter) && 1234f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (mPreviewEnabled || updateRequired) && 1235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (!(mPreviewEnabled && restartPreviewRequired)) ) { 1236f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret |= mCameraAdapter->setParameters(adapterParams); 1237f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1238f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1239f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT 1240b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) && 1241f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ( strcmp(valstr, android::CameraParameters::TRUE) == 0 )) 1242b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 1243b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGDA("Enabling shutter sound"); 1244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1245b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mShutterEnabled = true; 1246b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mMsgEnabled |= CAMERA_MSG_SHUTTER; 1247b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr); 1248b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1249b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil else if ( ( (valstr = params.get(TICameraParameters::KEY_SHUTTER_ENABLE)) != NULL ) && 1250f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ( strcmp(valstr, android::CameraParameters::FALSE) == 0 )) 1251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1252b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGDA("Disabling shutter sound"); 1253b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 1254b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mShutterEnabled = false; 1255b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mMsgEnabled &= ~CAMERA_MSG_SHUTTER; 1256b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.set(TICameraParameters::KEY_SHUTTER_ENABLE, valstr); 1257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1258a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev#endif 1259b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 1260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1261b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman //On fail restore old parameters 1262b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman if ( NO_ERROR != ret ) { 1263a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev mParameters = oldParams; 1264b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman } 1265b93aec67a3f7a66060a525a5c0d68fa0089f76c4Sundar Raman 1266b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // Restart Preview if needed by KEY_RECODING_HINT only if preview is already running. 1267b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // If preview is not started yet, Video Mode parameters will take effect on next startPreview() 12683dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng if (restartPreviewRequired && previewEnabled() && !mRecordingEnabled) { 1269ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu CAMHAL_LOGDA("Restarting Preview"); 1270b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil ret = restartPreview(); 12713dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng } else if (restartPreviewRequired && !previewEnabled() && 12723dcde7b7332edf04cd597b01d69950544dcd6589Akwasi Boateng mDisplayPaused && !mRecordingEnabled) { 1273f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Restarting preview in paused mode"); 1274f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = restartPreview(); 1275f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1276f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // TODO(XXX): If there is some delay between the restartPreview call and the code 1277f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // below, then the user could see some preview frames and callbacks. Let's find 1278f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // a better place to put this later... 1279f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret == NO_ERROR) { 1280f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mDisplayPaused = true; 1281f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewEnabled = false; 1282f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mDisplayAdapter->pauseDisplay(mDisplayPaused); 1283f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1285f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1286f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( !mBracketingRunning && mBracketingEnabled ) { 1287f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons startImageBracketing(); 1288ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu } 1289ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu 1290b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil if (ret != NO_ERROR) 1291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1292b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGEA("Failed to restart Preview"); 1293b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil return ret; 1294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1299b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil} 1300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewBufs(int width, int height, const char* previewFormat, 1302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int buffercount, unsigned int &max_queueable) 1303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mDisplayAdapter.get() == NULL) 1309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Memory allocation of preview buffers is now placed in gralloc 1311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // CameraHal should not allocate preview buffers without DisplayAdapter 1312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_MEMORY; 1313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1315f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(!mPreviewBuffers) 1316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewLength = 0; 1318f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewBuffers = mDisplayAdapter->allocateBufferList(width, height, 1319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev previewFormat, 1320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewLength, 1321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev buffercount); 1322f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NULL == mPreviewBuffers ) { 1323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't allocate preview buffers"); 1324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_MEMORY; 1325f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewOffsets = (uint32_t *) mDisplayAdapter->getOffsets(); 1328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mPreviewOffsets ) { 1329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Buffer mapping failed"); 1330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return BAD_VALUE; 1331f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBufProvider = (BufferProvider*) mDisplayAdapter.get(); 1334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mDisplayAdapter->maxQueueableBuffers(max_queueable); 1336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (ret != NO_ERROR) { 1337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1338f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewBufs() 1347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1351f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("mPreviewBuffers = %p", mPreviewBuffers); 1352f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(mPreviewBuffers) 1353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1354f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mBufProvider->freeBufferList(mPreviewBuffers); 1355f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewBuffers = NULL; 1356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::allocPreviewDataBufs(size_t size, size_t bufferCount) 1365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int bytes; 1368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytes = size; 1372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1375f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( NULL != mPreviewDataBuffers ) 1376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = freePreviewDataBufs(); 1378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1383c7a945e0434f1b99021d46fddf88bf776da6ad37Sundar Raman bytes = ((bytes+4095)/4096)*4096; 1384f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewDataBuffers = mMemoryManager->allocateBufferList(0, 0, NULL, bytes, bufferCount); 1385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDB("Size of Preview data buffer = %d", bytes); 1387f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( NULL == mPreviewDataBuffers ) 1388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager"); 1390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -NO_MEMORY; 1391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bytes = size; 1395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewDataFd = mMemoryManager->getFd(); 1401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewDataLength = bytes; 1402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewDataOffsets = mMemoryManager->getOffsets(); 1403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewDataFd = -1; 1407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewDataLength = 0; 1408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewDataOffsets = NULL; 1409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1411f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 1412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freePreviewDataBufs() 1417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1425f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( NULL != mPreviewDataBuffers ) 1426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1428f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mMemoryManager->freeBufferList(mPreviewDataBuffers); 1429f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewDataBuffers = NULL; 1430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::allocImageBufs(unsigned int width, unsigned int height, size_t size, 14401d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu const char* previewFormat, unsigned int bufferCount) 1441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 14431d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu int bytes = size; 1444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1447fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu // allocate image buffers only if not already allocated 1448f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(NULL != mImageBuffers) { 1449fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu return NO_ERROR; 1450fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu } 1451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 14521d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu if ( NO_ERROR == ret ) { 14531d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu bytes = ((bytes+4095)/4096)*4096; 1454f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mImageBuffers = mMemoryManager->allocateBufferList(0, 0, previewFormat, bytes, bufferCount); 14551d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu CAMHAL_LOGDB("Size of Image cap buffer = %d", bytes); 14561d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu if( NULL == mImageBuffers ) { 14571d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu CAMHAL_LOGEA("Couldn't allocate image buffers using memory manager"); 14581d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu ret = -NO_MEMORY; 14591d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu } else { 14601d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu bytes = size; 14611d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu } 1462f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1464f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR == ret ) { 1465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mImageFd = mMemoryManager->getFd(); 1466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mImageLength = bytes; 1467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mImageOffsets = mMemoryManager->getOffsets(); 1468f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 1469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mImageFd = -1; 1470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mImageLength = 0; 1471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mImageOffsets = NULL; 1472f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1474f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 1475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 147972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boatengstatus_t CameraHal::allocVideoBufs(uint32_t width, uint32_t height, uint32_t bufferCount) 148072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{ 148172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng status_t ret = NO_ERROR; 148272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng LOG_FUNCTION_NAME; 148372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 1484f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( NULL != mVideoBuffers ){ 1485f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = freeVideoBufs(mVideoBuffers); 1486f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoBuffers = NULL; 148772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 148872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 148972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng if ( NO_ERROR == ret ){ 149072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng int32_t stride; 1491f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraBuffer *buffers = new CameraBuffer [bufferCount]; 149272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 1493f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons memset (buffers, 0, sizeof(CameraBuffer) * bufferCount); 1494f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1495f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (buffers != NULL){ 1496f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons for (unsigned int i = 0; i< bufferCount; i++){ 1497f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::GraphicBufferAllocator &GrallocAlloc = android::GraphicBufferAllocator::get(); 1498f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons buffer_handle_t handle; 1499f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = GrallocAlloc.alloc(width, height, HAL_PIXEL_FORMAT_NV12, CAMHAL_GRALLOC_USAGE, &handle, &stride); 150072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng if (ret != NO_ERROR){ 150172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng CAMHAL_LOGEA("Couldn't allocate video buffers using Gralloc"); 150272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng ret = -NO_MEMORY; 1503f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons for (unsigned int j=0; j< i; j++){ 1504f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("Freeing Gralloc Buffer %p", buffers[i].opaque); 1505f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons GrallocAlloc.free((buffer_handle_t)buffers[i].opaque); 150672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 1507f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons delete [] buffers; 150872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng goto exit; 150972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 1510f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons buffers[i].type = CAMERA_BUFFER_GRALLOC; 1511f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons buffers[i].opaque = (void *)handle; 1512f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGVB("*** Gralloc Handle =0x%x ***", handle); 151372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 151472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 1515f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoBuffers = buffers; 151672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 151772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng else{ 151872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng CAMHAL_LOGEA("Couldn't allocate video buffers "); 151972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng ret = -NO_MEMORY; 152072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 152172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 152272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 152372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng exit: 1524f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 152572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 152672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng return ret; 152772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng} 152872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 1529f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::allocRawBufs(int width, int height, const char* previewFormat, int bufferCount) 1530f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 1531f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 1532f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1533f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME 1534f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1535f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1536f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ///@todo Enhance this method allocImageBufs() to take in a flag for burst capture 1537f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ///Always allocate the buffers for image capture using MemoryManager 1538f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NO_ERROR == ret) { 1539f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(( NULL != mVideoBuffers )) { 1540f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Re-use the buffer for raw capture. 1541f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1542f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1543f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1544f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1545f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR == ret ) { 1546f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoLength = 0; 1547f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoLength = (((width * height * 2) + 4095)/4096)*4096; 1548f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoBuffers = mMemoryManager->allocateBufferList(width, height, previewFormat, 1549f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoLength, bufferCount); 1550f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1551f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Size of Video cap buffer (used for RAW capture) %d", mVideoLength); 1552f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( NULL == mVideoBuffers ) { 1553f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Couldn't allocate Video buffers using memory manager"); 1554f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = -NO_MEMORY; 1555f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1556f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1557f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1558f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR == ret ) { 1559f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoFd = mMemoryManager->getFd(); 1560f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoOffsets = mMemoryManager->getOffsets(); 1561f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 1562f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoFd = -1; 1563f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoOffsets = NULL; 1564f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1565f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1566f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 1567f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1568f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1569f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 1570f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid endImageCapture( void *userData) 1572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != userData ) 1576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHal *c = reinterpret_cast<CameraHal *>(userData); 1578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev c->signalEndImageCapture(); 1579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid releaseImageBuffers(void *userData) 1585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1588fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu if (NULL != userData) { 1589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHal *c = reinterpret_cast<CameraHal *>(userData); 1590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev c->freeImageBufs(); 1591fab72086a1fa5d93037ec1355bc8b01355db0f41Tyler Luu } 1592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::signalEndImageCapture() 1597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int w,h; 1600f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 1601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1604f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mBufferSourceAdapter_Out.get()) { 1605f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mBufferSourceAdapter_Out->disableDisplay(); 1606f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1607f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1608f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mBufferSourceAdapter_In.get()) { 1609f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mBufferSourceAdapter_In->disableDisplay(); 1610f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1611f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 161288006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman if ( mBracketingRunning ) { 161388006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman stopImageBracketing(); 161488006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman } else { 161588006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE); 161688006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman } 1617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::freeImageBufs() 1624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1629f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NULL == mImageBuffers) { 1630f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return -EINVAL; 1631f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1633f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mBufferSourceAdapter_Out.get()) { 16341d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu mBufferSourceAdapter_Out = 0; 1635f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 1636f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mMemoryManager->freeBufferList(mImageBuffers); 1637f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1639ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu mImageBuffers = NULL; 1640ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu 1641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 1642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 1645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1646f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::freeVideoBufs(CameraBuffer *bufs) 164772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{ 164872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng status_t ret = NO_ERROR; 1649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 165072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng LOG_FUNCTION_NAME; 165172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 165272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS)); 1653f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(bufs == NULL) 165472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng { 165572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng CAMHAL_LOGEA("NULL pointer passed to freeVideoBuffer"); 165672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 165772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng return BAD_VALUE; 165872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 165972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 1660f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::GraphicBufferAllocator &GrallocAlloc = android::GraphicBufferAllocator::get(); 166172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 166272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng for(int i = 0; i < count; i++){ 1663f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGVB("Free Video Gralloc Handle 0x%x", bufs[i].opaque); 1664f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons GrallocAlloc.free((buffer_handle_t)bufs[i].opaque); 166572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 166672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 166772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 166872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 166972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng return ret; 167072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng} 1671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1672f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::freeRawBufs() 1673f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 1674f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 1675f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1676f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME 1677f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1678f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR == ret ) { 1679f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if( NULL != mVideoBuffers ) { 1680f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ///@todo Pluralise the name of this method to freeBuffers 1681f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mMemoryManager->freeBufferList(mVideoBuffers); 1682f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoBuffers = NULL; 1683f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 1684f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = -EINVAL; 1685f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1686f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1687f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1688f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT 1689f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1690f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1691f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 1692f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 1694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Start preview mode. 1695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 1697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR Camera switched to VF mode 1698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Update function header with the different errors that are possible 1699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 1701f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::startPreview() { 1702f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 1703f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1704f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // When tunneling is enabled during VTC, startPreview happens in 2 steps: 1705f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // When the application sends the command CAMERA_CMD_PREVIEW_INITIALIZATION, 1706f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // cameraPreviewInitialization() is called, which in turn causes the CameraAdapter 1707f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // to move from loaded to idle state. And when the application calls startPreview, 1708f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // the CameraAdapter moves from idle to executing state. 1709f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 1710f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // If the application calls startPreview() without sending the command 1711f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // CAMERA_CMD_PREVIEW_INITIALIZATION, then the function cameraPreviewInitialization() 1712f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // AND startPreview() are executed. In other words, if the application calls 1713f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // startPreview() without sending the command CAMERA_CMD_PREVIEW_INITIALIZATION, 1714f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // then the CameraAdapter moves from loaded to idle to executing state in one shot. 1715f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = cameraPreviewInitialization(); 1716f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1717f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // The flag mPreviewInitializationDone is set to true at the end of the function 1718f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // cameraPreviewInitialization(). Therefore, if everything goes alright, then the 1719f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // flag will be set. Sometimes, the function cameraPreviewInitialization() may 1720f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // return prematurely if all the resources are not available for starting preview. 1721f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // For example, if the preview window is not set, then it would return NO_ERROR. 1722f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Under such circumstances, one should return from startPreview as well and should 1723f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // not continue execution. That is why, we check the flag and not the return value. 1724f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!mPreviewInitializationDone) return ret; 1725f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1726f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Once startPreview is called, there is no need to continue to remember whether 1727f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // the function cameraPreviewInitialization() was called earlier or not. And so 1728f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // the flag mPreviewInitializationDone is reset here. Plus, this preserves the 1729f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // current behavior of startPreview under the circumstances where the application 1730f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // calls startPreview twice or more. 1731f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewInitializationDone = false; 1732f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1733f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ///Enable the display adapter if present, actual overlay enable happens when we post the buffer 1734f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(mDisplayAdapter.get() != NULL) { 1735f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Enabling display"); 1736f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int width, height; 1737f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.getPreviewSize(&width, &height); 1738f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1739f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 1740f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mDisplayAdapter->enableDisplay(width, height, &mStartPreview); 1741f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#else 1742f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mDisplayAdapter->enableDisplay(width, height, NULL); 1743f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 1744f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1745f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( ret != NO_ERROR ) { 1746f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Couldn't enable display"); 1747f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1748f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // FIXME: At this stage mStateSwitchLock is locked and unlock is supposed to be called 1749f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // only from mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW) 1750f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // below. But this will never happen because of goto error. Thus at next 1751f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // startPreview() call CameraHAL will be deadlocked. 1752f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Need to revisit mStateSwitch lock, for now just abort the process. 1753f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_ASSERT_X(false, 1754f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons "At this stage mCameraAdapter->mStateSwitchLock is still locked, " 1755f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons "deadlock is guaranteed"); 1756f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1757f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto error; 1758f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1759f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1760f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1761f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1762f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ///Send START_PREVIEW command to adapter 1763f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Starting CameraAdapter preview mode"); 1764f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1765f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_PREVIEW); 1766f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1767f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(ret!=NO_ERROR) { 1768f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Couldn't start preview w/ CameraAdapter"); 1769f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto error; 1770f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1771f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Started preview"); 1772f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1773f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewEnabled = true; 1774f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewStartInProgress = false; 1775f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1776f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1777f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons error: 1778f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1779f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Performing cleanup after error"); 1780f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1781f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons //Do all the cleanup 1782f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons freePreviewBufs(); 1783f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW); 1784f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(mDisplayAdapter.get() != NULL) { 1785f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mDisplayAdapter->disableDisplay(false); 1786f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1787f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mAppCallbackNotifier->stop(); 1788f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewStartInProgress = false; 1789f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewEnabled = false; 1790f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 1791f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1792f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1793f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 1794f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1795f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons//////////// 1796f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/** 1797f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @brief Set preview mode related initialization 1798f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons -> Camera Adapter set params 1799f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons -> Allocate buffers 1800f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons -> Set use buffers for preview 1801f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @param none 1802f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @return NO_ERROR 1803f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @todo Update function header with the different errors that are possible 1804f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1805f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */ 1806f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::cameraPreviewInitialization() 1807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 1808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 1810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraAdapter::BuffersDescriptor desc; 1811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraFrame frame; 1812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int required_buffer_count; 1813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int max_queueble_buffers; 1814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 1816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gettimeofday(&mStartPreview, NULL); 1817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 1818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 1820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1821f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mPreviewInitializationDone) { 1822f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_ERROR; 1823f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1824f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 18257016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng if ( mPreviewEnabled ){ 18267016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng CAMHAL_LOGDA("Preview already running"); 18277016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 18287016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng return ALREADY_EXISTS; 1829e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman } 1830e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman 1831e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman if ( NULL != mCameraAdapter ) { 18327016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng ret = mCameraAdapter->setParameters(mParameters); 18337016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng } 18347016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng 18357016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng if ((mPreviewStartInProgress == false) && (mDisplayPaused == false)){ 18367016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_RESOLUTION_PREVIEW,( int ) &frame); 18377016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng if ( NO_ERROR != ret ){ 18387016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng CAMHAL_LOGEB("Error: CAMERA_QUERY_RESOLUTION_PREVIEW %d", ret); 18397016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng return ret; 18407016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng } 18417016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng 18427016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng ///Update the current preview width and height 18437016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng mPreviewWidth = frame.mWidth; 18447016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng mPreviewHeight = frame.mHeight; 1845e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman } 1846e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman 1847e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman ///If we don't have the preview callback enabled and display adapter, 18487016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng if(!mSetPreviewWindowCalled || (mDisplayAdapter.get() == NULL)){ 1849f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Preview not started. Preview in progress flag set"); 18507016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng mPreviewStartInProgress = true; 18517016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_SWITCH_TO_EXECUTING); 18527016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng if ( NO_ERROR != ret ){ 18537016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng CAMHAL_LOGEB("Error: CAMERA_SWITCH_TO_EXECUTING %d", ret); 18547016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng return ret; 18557016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng } 18567016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng return NO_ERROR; 1857e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman } 1858e9ab1f4f653c21c2b526af02ceed12ecb935752cSundar Raman 1859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( (mDisplayAdapter.get() != NULL) && ( !mPreviewEnabled ) && ( mDisplayPaused ) ) 1860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Preview is in paused state"); 1862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayPaused = false; 1864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewEnabled = true; 1865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mDisplayAdapter->pauseDisplay(mDisplayPaused); 1868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 1870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Display adapter resume failed %x", ret); 1872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //restart preview callbacks 1875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) 1876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->enableMsgType (CAMERA_MSG_PREVIEW_FRAME); 1878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1879f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1880f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons signalEndImageCapture(); 1881ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu return ret; 1882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev required_buffer_count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS)); 1885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Allocate the preview buffers 18877016577b173fc73f5b43e76cbc122bb0a9346613Akwasi Boateng ret = allocPreviewBufs(mPreviewWidth, mPreviewHeight, mParameters.getPreviewFormat(), required_buffer_count, max_queueble_buffers); 1888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 1890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't allocate buffers for Preview"); 1892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto error; 1893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( mMeasurementEnabled ) 1896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_PREVIEW_DATA, 1899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( int ) &frame, 1900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev required_buffer_count); 1901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 1902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 1904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Allocate the preview data buffers 1907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = allocPreviewDataBufs(frame.mLength, required_buffer_count); 1908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) { 1909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't allocate preview data buffers"); 1910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto error; 1911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 1914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1915f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mBuffers = mPreviewDataBuffers; 1916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mOffsets = mPreviewDataOffsets; 1917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mFd = mPreviewDataFd; 1918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mLength = mPreviewDataLength; 1919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mCount = ( size_t ) required_buffer_count; 1920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mMaxQueueable = (size_t) required_buffer_count; 1921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW_DATA, 1923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( int ) &desc); 1924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Pass the buffers to Camera Adapter 1929f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mBuffers = mPreviewBuffers; 1930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mOffsets = mPreviewOffsets; 1931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mFd = mPreviewFd; 1932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mLength = mPreviewLength; 1933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mCount = ( size_t ) required_buffer_count; 1934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mMaxQueueable = (size_t) max_queueble_buffers; 1935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 19368fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_PREVIEW, 19378fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman ( int ) &desc); 19388fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman 19398fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman if ( NO_ERROR != ret ) 19408fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman { 19418fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman CAMHAL_LOGEB("Failed to register preview buffers: 0x%x", ret); 19428fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman freePreviewBufs(); 19438fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman return ret; 19448fb9734825448eebe07b080b0c2e82565111cca2Sundar Raman } 1945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Start the callback notifier 1947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mAppCallbackNotifier->start(); 1948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( ALREADY_EXISTS == ret ) 1950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Already running, do nothing 1952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("AppCallbackNotifier already running"); 1953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = NO_ERROR; 1954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else if ( NO_ERROR == ret ) { 1956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Started AppCallbackNotifier.."); 1957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->setMeasurements(mMeasurementEnabled); 1958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 1960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 1961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Couldn't start AppCallbackNotifier"); 1962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto error; 1963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 1964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 1965f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret == NO_ERROR) mPreviewInitializationDone = true; 1966f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1967f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mAppCallbackNotifier->startPreviewCallbacks(mParameters, mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, required_buffer_count); 1968f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1969f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1970f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1971f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons error: 1972f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1973f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Performing cleanup after error"); 1974f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1975f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons //Do all the cleanup 1976f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons freePreviewBufs(); 1977f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_PREVIEW); 1978f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(mDisplayAdapter.get() != NULL) 1979f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 1980f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mDisplayAdapter->disableDisplay(false); 1981f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 1982f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mAppCallbackNotifier->stop(); 1983f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewStartInProgress = false; 1984f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewEnabled = false; 1985f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 1986f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1987f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 1988f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 1989f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1990f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/** 1991f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @brief Sets ANativeWindow object. 1992f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1993f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons Preview buffers provided to CameraHal via this object. DisplayAdapter will be interfacing with it 1994f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons to render buffers to display. 1995f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 1996f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @param[in] window The ANativeWindow object created by Surface flinger 1997f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @return NO_ERROR If the ANativeWindow object passes validation criteria 1998f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios 1999f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2000f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */ 2001f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::setPreviewWindow(struct preview_stream_ops *window) 2002f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 2003f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 2004f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraAdapter::BuffersDescriptor desc; 2005f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2006f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 2007f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mSetPreviewWindowCalled = true; 2008f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2009f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ///If the Camera service passes a null window, we destroy existing window and free the DisplayAdapter 2010f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(!window) 2011f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 2012f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(mDisplayAdapter.get() != NULL) 2013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2014f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ///NULL window passed, destroy the display adapter if present 2015f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("NULL window passed, destroying display adapter"); 2016f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mDisplayAdapter.clear(); 2017f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ///@remarks If there was a window previously existing, we usually expect another valid window to be passed by the client 2018f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ///@remarks so, we will wait until it passes a valid window to begin the preview again 2019f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mSetPreviewWindowCalled = false; 2020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2021f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("NULL ANativeWindow passed to setPreviewWindow"); 2022f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_ERROR; 2023f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons }else if(mDisplayAdapter.get() == NULL) 2024f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 2025f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Need to create the display adapter since it has not been created 2026f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Create display adapter 2027f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mDisplayAdapter = new ANativeWindowDisplayAdapter(); 2028f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT 2029f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mDisplayAdapter->setExtendedOps(mExtendedPreviewStreamOps); 2030f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 2031f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = NO_ERROR; 2032f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(!mDisplayAdapter.get() || ((ret=mDisplayAdapter->initialize())!=NO_ERROR)) 2033f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 2034f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(ret!=NO_ERROR) 2035f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 2036f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mDisplayAdapter.clear(); 2037f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("DisplayAdapter initialize failed"); 2038f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 2039f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 2040f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 2042f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 2043f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Couldn't create DisplayAdapter"); 2044f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 2045f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_MEMORY; 2046f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2047f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2048f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2049f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // DisplayAdapter needs to know where to get the CameraFrames from inorder to display 2050f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Since CameraAdapter is the one that provides the frames, set it as the frame provider for DisplayAdapter 2051f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mDisplayAdapter->setFrameProvider(mCameraAdapter); 2052f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2053f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Any dynamic errors that happen during the camera use case has to be propagated back to the application 2054f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that notifies such errors to the application 2055f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Set it as the error handler for the DisplayAdapter 2056f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mDisplayAdapter->setErrorHandler(mAppCallbackNotifier.get()); 2057f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2058f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Update the display adapter with the new window that is passed from CameraService 2059f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mDisplayAdapter->setPreviewWindow(window); 2060f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(ret!=NO_ERROR) 2061f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 2062f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret); 2063f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2064f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2065f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(mPreviewStartInProgress) 2066f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 2067f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("setPreviewWindow called when preview running"); 2068f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Start the preview since the window is now available 2069f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = startPreview(); 2070f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2071f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 2072f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Update the display adapter with the new window that is passed from CameraService 2073f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mDisplayAdapter->setPreviewWindow(window); 2074f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (NO_ERROR == ret) && previewEnabled() ) { 2075f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons restartPreview(); 2076f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (ret == ALREADY_EXISTS) { 2077f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // ALREADY_EXISTS should be treated as a noop in this case 2078f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = NO_ERROR; 2079f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2080f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2081f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 2082f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2083f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 2084f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2085f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 2086f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2087f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2088f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM 2089f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid CameraHal::setExtendedPreviewStreamOps(preview_stream_extended_ops_t *ops) 2090f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 2091f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mExtendedPreviewStreamOps = ops; 2092f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 2093f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2094f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/** 2095f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @brief Sets Tapout Surfaces. 2096f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2097f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons Buffers provided to CameraHal via this object for tap-out 2098f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons functionality. 2099f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2100f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @param[in] window The ANativeWindow object created by Surface flinger 2101f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @return NO_ERROR If the ANativeWindow object passes validation criteria 2102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios 2103f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2104f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */ 2105f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::setTapoutLocked(struct preview_stream_ops *tapout) 2106f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 2107f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 2108f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int index = -1; 2109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2110f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 2111f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!tapout) { 2113f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Missing argument"); 2114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 2115f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_ERROR; 2116f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2117f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Set tapout point 2119f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 1. Check name of tap-out 2120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 2. If not already set, then create a new one 2121f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 3. Allocate buffers. If user is re-setting the surface, free buffers first and re-allocate 2122f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // in case dimensions have changed 2123f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons for (unsigned int i = 0; i < mOutAdapters.size(); i++) { 2125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::sp<DisplayAdapter> out; 2126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons out = mOutAdapters.itemAt(i); 2127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = out->setPreviewWindow(tapout); 2128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret == ALREADY_EXISTS) { 2129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Tap Out already set at index = %d", i); 2130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons index = i; 2131f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = NO_ERROR; 2132f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2133f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (index < 0) { 2136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::sp<DisplayAdapter> out = new BufferSourceAdapter(); 2137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = out->initialize(); 2139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret != NO_ERROR) { 2140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons out.clear(); 2141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("DisplayAdapter initialize failed"); 2142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto exit; 2143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // BufferSourceAdapter will be handler of the extended OPS 2146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons out->setExtendedOps(mExtendedPreviewStreamOps); 2147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // CameraAdapter will be the frame provider for BufferSourceAdapter 2149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons out->setFrameProvider(mCameraAdapter); 2150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // BufferSourceAdapter will use ErrorHandler to send errors back to 2152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // the application 2153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons out->setErrorHandler(mAppCallbackNotifier.get()); 2154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Update the display adapter with the new window that is passed from CameraService 2156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = out->setPreviewWindow(tapout); 2157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(ret != NO_ERROR) { 2158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret); 2159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto exit; 2160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2161f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 21621d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu if (NULL != mCameraAdapter) { 21631d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu unsigned int bufferCount, max_queueable; 21641d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu CameraFrame frame; 21651d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu 21661d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu bufferCount = out->getBufferCount(); 21671d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu if (bufferCount < 1) bufferCount = NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP; 21681d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu 21691d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE, 21701d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu ( int ) &frame, 21711d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu bufferCount); 21721d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu if (NO_ERROR != ret) { 21731d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret); 21741d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu } 21751d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu if (NO_ERROR == ret) { 21761d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu CameraBuffer *bufs = NULL; 21771d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu unsigned int stride; 21781d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu unsigned int height = frame.mHeight; 21791d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu int size = frame.mLength; 21801d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu 21811d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu stride = frame.mAlignment / getBPP(mParameters.getPictureFormat()); 21821d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu bufs = out->allocateBufferList(stride, 21831d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu height, 21841d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu mParameters.getPictureFormat(), 21851d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu size, 21861d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu bufferCount); 21871d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu if (bufs == NULL){ 21881d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu CAMHAL_LOGEB("error allocating buffer list"); 21891d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu goto exit; 21901d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu } 21911d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu } 21921d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu } 2193f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mOutAdapters.add(out); 2194f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2195f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2196f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsexit: 2197f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2198f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 2199f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2200f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 2201f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 2202f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2203f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/** 2204f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @brief Releases Tapout Surfaces. 2205f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2206f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @param[in] window The ANativeWindow object created by Surface flinger 2207f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @return NO_ERROR If the ANativeWindow object passes validation criteria 2208f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios 2209f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2210f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */ 2211f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::releaseTapoutLocked(struct preview_stream_ops *tapout) 2212f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 2213f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 2214f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons char id[OP_STR_SIZE]; 2215f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2216f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 2217f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2218f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!tapout) { 2219f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Missing argument"); 2220f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 2221f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_ERROR; 2222f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Get the name of tapout 2225f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mExtendedPreviewStreamOps->get_id(tapout, id, sizeof(id)); 2226f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NO_ERROR != ret) { 2227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("get_id OPS returned error %d", ret); 2228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 2229f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2230f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2231f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 1. Check name of tap-out 2232f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 2. If exist, then free buffers and then remove it 2233f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mBufferSourceAdapter_Out.get() && mBufferSourceAdapter_Out->match(id)) { 2234f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("REMOVE tap out %p previously set as current", tapout); 2235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mBufferSourceAdapter_Out.clear(); 2236f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2237f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons for (unsigned int i = 0; i < mOutAdapters.size(); i++) { 2238f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::sp<DisplayAdapter> out; 2239f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons out = mOutAdapters.itemAt(i); 2240f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (out->match(id)) { 2241f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("REMOVE tap out %p \"%s\" at position %d", tapout, id, i); 2242f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mOutAdapters.removeAt(i); 2243f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons break; 2244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2245f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2247f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 2248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2249f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 2250f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 2251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2252f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/** 2253f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @brief Sets Tapin Surfaces. 2254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2255f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons Buffers provided to CameraHal via this object for tap-in 2256f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons functionality. 2257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2258f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @param[in] window The ANativeWindow object created by Surface flinger 2259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @return NO_ERROR If the ANativeWindow object passes validation criteria 2260f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios 2261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2262f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */ 2263f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::setTapinLocked(struct preview_stream_ops *tapin) 2264f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 2265f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 2266f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int index = -1; 2267f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2268f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 2269f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2270f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!tapin) { 2271f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Missing argument"); 2272f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 2273f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_ERROR; 2274f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2275f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2276f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 1. Set tapin point 2277f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 1. Check name of tap-in 2278f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 2. If not already set, then create a new one 2279f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 3. Allocate buffers. If user is re-setting the surface, free buffers first and re-allocate 2280f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // in case dimensions have changed 2281f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons for (unsigned int i = 0; i < mInAdapters.size(); i++) { 2282f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::sp<DisplayAdapter> in; 2283f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons in = mInAdapters.itemAt(i); 2284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = in->setPreviewWindow(tapin); 2285f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret == ALREADY_EXISTS) { 2286f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Tap In already set at index = %d", i); 2287f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons index = i; 2288f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = NO_ERROR; 2289f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2290f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2291f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (index < 0) { 2293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::sp<DisplayAdapter> in = new BufferSourceAdapter(); 2294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2295f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = in->initialize(); 2296f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret != NO_ERROR) { 2297f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons in.clear(); 2298f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("DisplayAdapter initialize failed"); 2299f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto exit; 2300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2302f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // BufferSourceAdapter will be handler of the extended OPS 2303f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons in->setExtendedOps(mExtendedPreviewStreamOps); 2304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2305f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // CameraAdapter will be the frame provider for BufferSourceAdapter 2306f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons in->setFrameProvider(mCameraAdapter); 2307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2308f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // BufferSourceAdapter will use ErrorHandler to send errors back to 2309f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // the application 2310f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons in->setErrorHandler(mAppCallbackNotifier.get()); 2311f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2312f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Update the display adapter with the new window that is passed from CameraService 2313f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = in->setPreviewWindow(tapin); 2314f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(ret != NO_ERROR) { 2315f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("DisplayAdapter setPreviewWindow returned error %d", ret); 2316f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto exit; 2317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2319f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mInAdapters.add(in); 2320f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2321f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2322f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsexit: 2323f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2324f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 2325f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 2327f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 2328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2330f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/** 2331f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @brief Releases Tapin Surfaces. 2332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2333f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @param[in] window The ANativeWindow object created by Surface flinger 2334f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @return NO_ERROR If the ANativeWindow object passes validation criteria 2335f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios 2336f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2337f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */ 2338f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::releaseTapinLocked(struct preview_stream_ops *tapin) 2339f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 2340f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 2341f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons char id[OP_STR_SIZE]; 2342f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2343f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 2344f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2345f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!tapin) { 2346f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Missing argument"); 2347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2348f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_ERROR; 2349f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2351f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Get the name of tapin 2352f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mExtendedPreviewStreamOps->get_id(tapin, id, sizeof(id)); 2353f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NO_ERROR != ret) { 2354f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("get_id OPS returned error %d", ret); 2355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 2356f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2357f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2358f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 1. Check name of tap-in 2359f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 2. If exist, then free buffers and then remove it 2360f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mBufferSourceAdapter_In.get() && mBufferSourceAdapter_In->match(id)) { 2361f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("REMOVE tap in %p previously set as current", tapin); 2362f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mBufferSourceAdapter_In.clear(); 2363f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2364f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons for (unsigned int i = 0; i < mInAdapters.size(); i++) { 2365f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::sp<DisplayAdapter> in; 2366f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons in = mInAdapters.itemAt(i); 2367f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (in->match(id)) { 2368f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("REMOVE tap in %p \"%s\" at position %d", tapin, id, i); 2369f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mInAdapters.removeAt(i); 2370f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons break; 2371f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2372f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2373f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2374f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 2375f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2376f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 2377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2379f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 2381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Sets ANativeWindow object. 2382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2383f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons Buffers provided to CameraHal via this object for tap-in/tap-out 2384f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons functionality. 2385f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2386f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons TODO(XXX): this is just going to use preview_stream_ops for now, but we 2387f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons most likely need to extend it when we want more functionality 2388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] window The ANativeWindow object created by Surface flinger 2390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR If the ANativeWindow object passes validation criteria 2391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios 2392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 2394f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::setBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout) 2395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 2396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 2397f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int index = -1; 2398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 2400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2401f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 2402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2403f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD ("setBufferSource(%p, %p)", tapin, tapout); 2404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2405f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = setTapoutLocked(tapout); 2406f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret != NO_ERROR) { 2407f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("setTapoutLocked returned error 0x%x", ret); 2408f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto exit; 2409f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2411f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = setTapinLocked(tapin); 2412f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret != NO_ERROR) { 2413f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("setTapinLocked returned error 0x%x", ret); 2414f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto exit; 2415f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2417f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsexit: 2418f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 2419f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 2421f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 2422f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2423f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2424f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/** 2425f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @brief Releases ANativeWindow object. 2426f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2427f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons Release Buffers previously released with setBufferSource() 2428f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2429f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons TODO(XXX): this is just going to use preview_stream_ops for now, but we 2430f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons most likely need to extend it when we want more functionality 2431f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2432f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @param[in] window The ANativeWindow object created by Surface flinger 2433f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @return NO_ERROR If the ANativeWindow object passes validation criteria 2434f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @todo Define validation criteria for ANativeWindow object. Define error codes for scenarios 2435f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2436f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */ 2437f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::releaseBufferSource(struct preview_stream_ops *tapin, struct preview_stream_ops *tapout) 2438f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 2439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 2440f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int index = -1; 2441f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2442f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 2443f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2444f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 2445f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD ("releaseBufferSource(%p, %p)", tapin, tapout); 2446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (tapout) { 2447f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret |= releaseTapoutLocked(tapout); 2448f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret != NO_ERROR) { 2449f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Error %d to release tap out", ret); 2450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2451f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2452f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2453f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (tapin) { 2454f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret |= releaseTapinLocked(tapin); 2455f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret != NO_ERROR) { 2456f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Error %d to release tap in", ret); 245739371f31292f050f7fd75f7d36c7c9eeffd4ae64Tyler Luu } 2458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2459f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2460f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsexit: 2461f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 2465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 2467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 2470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Stop a previously started preview. 2471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 2473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return none 2474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 2476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopPreview() 2477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 2478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 2479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2480150f3c891ce774b1546e90fab640ccb9c29ce536Akwasi Boateng if( (!previewEnabled() && !mDisplayPaused) || mRecordingEnabled) 2481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 2484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2486f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons bool imageCaptureRunning = (mCameraAdapter->getState() & CameraAdapter::CAPTURE_STATE) && 24870e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE); 24880e5d32b3afece9b292864fccd4b5390b4ef57ddbSundar Raman if(mDisplayPaused && !imageCaptureRunning) 2489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Display is paused, which essentially means there is no preview active. 2491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Note: this is done so that when stopPreview is called by client after 2492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // an image capture, we do not de-initialize the camera adapter and 2493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // restart over again. 249497db71f3a06c88c16f46fea8189f542dcde28f7fTyler Luu 2495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 2496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev forceStopPreview(); 2499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2500b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // Reset Capture-Mode to default, so that when we switch from VideoRecording 2501b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // to ImageCapture, CAPTURE_MODE is not left to VIDEO_MODE. 2502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Resetting Capture-Mode to default"); 2503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mParameters.set(TICameraParameters::KEY_CAP_MODE, ""); 2504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 2509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Returns true if preview is enabled 2510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 2512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return true If preview is running currently 2513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev false If preview has been stopped 2514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 2516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::previewEnabled() 2517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 2518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 2519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return (mPreviewEnabled || mPreviewStartInProgress); 2521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 2524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Start record mode. 2525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev When a record image is available a CAMERA_MSG_VIDEO_FRAME message is sent with 2527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev the corresponding frame. Every record frame must be released by calling 2528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev releaseRecordingFrame(). 2529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 2531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR If recording could be started without any issues 2532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Update the header with possible error values in failure scenarios 2533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 2535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startRecording( ) 2536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 2537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int w, h; 2538b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil const char *valstr = NULL; 2539b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil bool restartPreviewRequired = false; 2540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 2541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 2543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 2546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gettimeofday(&mStartPreview, NULL); 2548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 2550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!previewEnabled()) 2552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 2554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 25569743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu // set internal recording hint in case camera adapter needs to make some 25579743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu // decisions....(will only be sent to camera adapter if camera restart is required) 2558f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_RECORDING_HINT, android::CameraParameters::TRUE); 25599743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu 25609743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu // if application starts recording in continuous focus picture mode... 25619743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu // then we need to force default capture mode (as opposed to video mode) 2562f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( ((valstr = mParameters.get(android::CameraParameters::KEY_FOCUS_MODE)) != NULL) && 2563f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (strcmp(valstr, android::CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) == 0) ){ 25649743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu restartPreviewRequired = resetVideoModeParameters(); 25659743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu } 25669743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu 25679743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu // only need to check recording hint if preview restart is not already needed 2568f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = mParameters.get(android::CameraParameters::KEY_RECORDING_HINT); 25699743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu if ( !restartPreviewRequired && 2570f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (!valstr || (valstr && (strcmp(valstr, android::CameraParameters::TRUE) != 0))) ) { 25718b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu restartPreviewRequired = setVideoModeParameters(mParameters); 25729743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu } 2573b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 25749743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu if (restartPreviewRequired) { 2575f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 2576f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 2577f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapModeBackup = mParameters.get(TICameraParameters::KEY_CAP_MODE); 2578f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 25799743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu ret = restartPreview(); 25809743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu } 2581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 258372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng { 258472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng int count = atoi(mCameraProperties->get(CameraProperties::REQUIRED_PREVIEW_BUFS)); 258572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mParameters.getPreviewSize(&w, &h); 258672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng CAMHAL_LOGDB("%s Video Width=%d Height=%d", __FUNCTION__, mVideoWidth, mVideoHeight); 258772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 258872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng if ((w != mVideoWidth) && (h != mVideoHeight)) 258972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng { 259072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng ret = allocVideoBufs(mVideoWidth, mVideoHeight, count); 259172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng if ( NO_ERROR != ret ) 259272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng { 259372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret); 25949743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu mParameters.remove(TICameraParameters::KEY_RECORDING_HINT); 259572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng return ret; 259672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 259772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 259872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mAppCallbackNotifier->useVideoBuffers(true); 259972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mAppCallbackNotifier->setVideoRes(mVideoWidth, mVideoHeight); 2600f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, count, mVideoBuffers); 260172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 260272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng else 260372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng { 260472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mAppCallbackNotifier->useVideoBuffers(false); 260572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mAppCallbackNotifier->setVideoRes(mPreviewWidth, mPreviewHeight); 2606f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mAppCallbackNotifier->initSharedVideoBuffers(mPreviewBuffers, mPreviewOffsets, mPreviewFd, mPreviewLength, count, NULL); 260772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 260872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 2609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 2611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mAppCallbackNotifier->startRecording(); 2613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 2616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Buffers for video capture (if different from preview) are expected to be allocated within CameraAdapter 2618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_VIDEO); 2619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 2622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecordingEnabled = true; 2624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 2629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 2632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Set the camera parameters specific to Video Recording. 2633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev This function checks for the camera parameters which have to be set for recording. 2635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Video Recording needs CAPTURE_MODE to be VIDEO_MODE. This function sets it. 2636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev This function also enables Video Recording specific functions like VSTAB & VNF. 2637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 2639b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect. 2640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Modify the policies for enabling VSTAB & VNF usecase based later. 2641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 2643f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsbool CameraHal::setVideoModeParameters(const android::CameraParameters& params) 2644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 2645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *valstr = NULL; 2646a6e9160507cd4c0d276fbe45a1efb1dae28c3998Emilian Peev const char *valstrRemote = NULL; 2647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bool restartPreviewRequired = false; 2648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 2650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview 2652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE); 2653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( (valstr == NULL) || 2654f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ( (valstr != NULL) && ( (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE) != 0) && 2655f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (strcmp(valstr, (const char *) TICameraParameters::VIDEO_MODE_HQ ) != 0) ) ) ) { 2656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Set CAPTURE_MODE to VIDEO_MODE"); 2657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mParameters.set(TICameraParameters::KEY_CAP_MODE, (const char *) TICameraParameters::VIDEO_MODE); 2658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev restartPreviewRequired = true; 2659f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2661f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // set VSTAB. restart is required if vstab value has changed 2662f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (valstrRemote = params.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) != NULL ) { 2663f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // make sure we support vstab 2664f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED), 2665f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::TRUE) == 0) { 2666f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION); 2667f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // vstab value has changed 2668f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstr != NULL) && 2669f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons strcmp(valstr, valstrRemote) != 0) { 2670f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons restartPreviewRequired = true; 2671cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil } 2672f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_VIDEO_STABILIZATION, 2673f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstrRemote); 26748b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu } 2675f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION)) { 2676f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // vstab was configured but now unset 2677f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons restartPreviewRequired = true; 2678f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(android::CameraParameters::KEY_VIDEO_STABILIZATION); 2679f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2681f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Set VNF 2682f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((valstrRemote = params.get(TICameraParameters::KEY_VNF)) == NULL) { 2683f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDA("Enable VNF"); 2684f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_VNF, android::CameraParameters::TRUE); 2685f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons restartPreviewRequired = true; 2686f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 2687f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = mParameters.get(TICameraParameters::KEY_VNF); 2688f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valstr && strcmp(valstr, valstrRemote) != 0) { 2689cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil restartPreviewRequired = true; 26908b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu } 2691f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_VNF, valstrRemote); 2692f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2694f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#if !defined(OMAP_ENHANCEMENT) && !defined(ENHANCED_DOMX) 2695cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil // For VSTAB alone for 1080p resolution, padded width goes > 2048, which cannot be rendered by GPU. 2696cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil // In such case, there is support in Ducati for combination of VSTAB & VNF requiring padded width < 2048. 2697cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil // So we are forcefully enabling VNF, if VSTAB is enabled for 1080p resolution. 2698f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int w, h; 2699f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons params.getPreviewSize(&w, &h); 2700f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = mParameters.get(android::CameraParameters::KEY_VIDEO_STABILIZATION); 2701f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valstr && (strcmp(valstr, android::CameraParameters::TRUE) == 0) && (w == 1920)) { 2702cdeb4bffa1685907cbdd64cfbf372409c3b20b36Kalpesh Patil CAMHAL_LOGDA("Force Enable VNF for 1080p"); 2703f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons const char *valKeyVnf = mParameters.get(TICameraParameters::KEY_VNF); 2704f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(!valKeyVnf || (strcmp(valKeyVnf, android::CameraParameters::TRUE) != 0)) { 2705f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_VNF, android::CameraParameters::TRUE); 2706f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons restartPreviewRequired = true; 2707f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2709f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 2710f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 2711b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil LOG_FUNCTION_NAME_EXIT; 2712b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2713b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil return restartPreviewRequired; 2714b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil} 2715b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2716b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/** 2717b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil @brief Reset the camera parameters specific to Video Recording. 2718b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2719b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil This function resets CAPTURE_MODE and disables Recording specific functions like VSTAB & VNF. 2720b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2721b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil @param none 2722b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil @return true if preview needs to be restarted for VIDEO_MODE parameters to take effect. 2723b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2724b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */ 2725b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilbool CameraHal::resetVideoModeParameters() 2726b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{ 2727b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil const char *valstr = NULL; 2728b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil bool restartPreviewRequired = false; 2729b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil status_t ret = NO_ERROR; 2730b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2731b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil LOG_FUNCTION_NAME; 2732b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2733d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu // ignore this if we are already recording 2734d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu if (mRecordingEnabled) { 2735d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu return false; 2736d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu } 2737d2d3968a441810c81cf9f46ff43af29cb6fdfb93Tyler Luu 2738b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // Set CAPTURE_MODE to VIDEO_MODE, if not set already and Restart Preview 2739b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE); 27408b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu if ((valstr != NULL) && (strcmp(valstr, TICameraParameters::VIDEO_MODE) == 0)) { 2741b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil CAMHAL_LOGDA("Reset Capture-Mode to default"); 2742b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mParameters.set(TICameraParameters::KEY_CAP_MODE, ""); 2743b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil restartPreviewRequired = true; 27448b0b73df9a2fe8e4fc2c36919d05321f2d96d543Tyler Luu } 2745b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2746b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil LOG_FUNCTION_NAME_EXIT; 2747b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2748b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil return restartPreviewRequired; 2749b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil} 2750b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2751b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil/** 2752b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil @brief Restart the preview with setParameter. 2753b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2754b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil This function restarts preview, for some VIDEO_MODE parameters to take effect. 2755b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2756b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil @param none 2757b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil @return NO_ERROR If recording parameters could be set without any issues 2758b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2759b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil */ 2760b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patilstatus_t CameraHal::restartPreview() 2761b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil{ 2762b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil status_t ret = NO_ERROR; 2763b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2764b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil LOG_FUNCTION_NAME; 2765b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2766b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil // Retain CAPTURE_MODE before calling stopPreview(), since it is reset in stopPreview(). 2767b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2768ceae1d5450522c01889ebc782a3b71c5d38eac07Tyler Luu forceStopPreview(); 2769b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2770b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil { 2771f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 2772f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!mCapModeBackup.isEmpty()) { 2773f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_CAP_MODE, mCapModeBackup.string()); 2774f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCapModeBackup = ""; 2775f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 2776f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_CAP_MODE, ""); 2777f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 2778b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil mCameraAdapter->setParameters(mParameters); 2779b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil } 2780b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2781b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil ret = startPreview(); 2782b4a28dec029ecbd35aa27984f8681ae98286eca0Kalpesh Patil 2783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 2786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 2789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Stop a previously started recording. 2790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 2792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return none 2793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 2795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::stopRecording() 2796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 27977d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu CameraAdapter::AdapterState currentState; 27987d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu 2799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 2800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2801f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 28027d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu 2803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (!mRecordingEnabled ) 2804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 2806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 28087d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu currentState = mCameraAdapter->getState(); 28097d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu if (currentState == CameraAdapter::VIDEO_CAPTURE_STATE) { 28107d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_IMAGE_CAPTURE); 28117d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu } 28127d9e44875d553c966d2e5d7b89de8ac23be1c1f2Tyler Luu 2813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->stopRecording(); 2814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_VIDEO); 2816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecordingEnabled = false; 2818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 281972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng if ( mAppCallbackNotifier->getUesVideoBuffers() ){ 2820f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons freeVideoBufs(mVideoBuffers); 2821f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mVideoBuffers){ 2822f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGVB(" FREEING mVideoBuffers %p", mVideoBuffers); 2823f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons delete [] mVideoBuffers; 282472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 2825f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoBuffers = NULL; 282672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 282772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 28289743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu // reset internal recording hint in case camera adapter needs to make some 28299743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu // decisions....(will only be sent to camera adapter if camera restart is required) 28309743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu mParameters.remove(TICameraParameters::KEY_RECORDING_HINT); 28319743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu 2832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 2836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Returns true if recording is enabled. 2837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 2839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return true If recording is currently running 2840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev false If recording has been stopped 2841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 2843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint CameraHal::recordingEnabled() 2844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 2845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 2846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return mRecordingEnabled; 2850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 2853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Release a record frame previously returned by CAMERA_MSG_VIDEO_FRAME. 2854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] mem MemoryBase pointer to the frame being released. Must be one of the buffers 2856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev previously given by CameraHal 2857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return none 2858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 2860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::releaseRecordingFrame(const void* mem) 2861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 2862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 2863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //CAMHAL_LOGDB(" 0x%x", mem->pointer()); 2865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( mRecordingEnabled ) && mem != NULL) 2867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->releaseRecordingFrame(mem); 2869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return; 2874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 2877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Start auto focus 2878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev This call asynchronous. 2880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev The notification callback routine is called with CAMERA_MSG_FOCUS once when 2881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focusing is complete. autoFocus() will be called again if another auto focus is 2882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev needed. 2883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 2885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR 2886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Define the error codes if the focus is not locked 2887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 2889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::autoFocus() 2890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 2891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 2892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 2894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gettimeofday(&mStartFocus, NULL); 2896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 2898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 2900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2901f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 290278dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev 29032ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu mMsgEnabled |= CAMERA_MSG_FOCUS; 29042ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu 290578dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev if ( NULL == mCameraAdapter ) 290678dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev { 290778dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev ret = -1; 290878dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev goto EXIT; 290978dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev } 291078dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev 291178dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev CameraAdapter::AdapterState state; 291278dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev ret = mCameraAdapter->getState(state); 291378dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev if (ret != NO_ERROR) 291478dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev { 291578dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev goto EXIT; 291678dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev } 29172ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu 291878dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev if (state == CameraAdapter::AF_STATE) 2919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2920e46394481e771dbdc8683645c3740a3d262a3d0fIliyan Malchev CAMHAL_LOGI("Ignoring start-AF (already in progress)"); 292178dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev goto EXIT; 292278dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan Malchev } 2923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 2925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //pass the autoFocus timestamp along with the command to camera adapter 2927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS, ( int ) &mStartFocus); 2928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else 2930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_PERFORM_AUTOFOCUS); 2932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 2934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 293578dac813ae2c442dd0669db208abd3720d0ea6c4Iliyan MalchevEXIT: 2936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 2939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2941c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 2942c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Cancels auto-focus function. 2943c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2944c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev If the auto-focus is still in progress, this function will cancel it. 2945c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Whether the auto-focus is in progress or not, this function will return the 2946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev focus position to the default. If the camera does not support auto-focus, this is a no-op. 2947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 2950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR If the cancel succeeded 2951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Define error codes if cancel didnt succeed 2952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 2954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelAutoFocus() 2955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 2956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 29572ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu 2958f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 2959f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters adapterParams = mParameters; 29602ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu mMsgEnabled &= ~CAMERA_MSG_FOCUS; 29612ecb39c0ca21ce9ae00c4585e3f7002e8b4e6ca7Tyler Luu 2962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( NULL != mCameraAdapter ) 2963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2964f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons adapterParams.set(TICameraParameters::KEY_AUTO_FOCUS_LOCK, android::CameraParameters::FALSE); 2965fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu mCameraAdapter->setParameters(adapterParams); 2966c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter->sendCommand(CameraAdapter::CAMERA_CANCEL_AUTOFOCUS); 29673ec18006399d61e97382601d14aaa43ee339c8b6Sundar Raman mAppCallbackNotifier->flushEventQueue(); 2968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2969fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu 2970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 2972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::setEventProvider(int32_t eventMask, MessageNotifier * eventNotifier) 2975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 2976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 2978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mEventProvider ) 2980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS); 2982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete mEventProvider; 2983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider = NULL; 2984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider = new EventProvider(eventNotifier, this, eventCallbackRelay); 2987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == mEventProvider ) 2988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2989c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error in creating EventProvider"); 2990c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2991c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 2992c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 2993c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider->enableEventNotification(eventMask); 2994c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 2995c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2996c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 2997c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 2998c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 2999c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallbackRelay(CameraHalEvent* event) 3000c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3001c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3002c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3003c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraHal *appcbn = ( CameraHal * ) (event->mCookie); 3004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev appcbn->eventCallback(event ); 3005c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 3007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::eventCallback(CameraHalEvent* event) 3010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 3014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::startImageBracketing() 3017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3018f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 3019f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraFrame frame; 3020f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraAdapter::BuffersDescriptor desc; 3021f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons unsigned int max_queueable = 0; 3022f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3023f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 3026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gettimeofday(&mStartCapture, NULL); 3028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 3030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!previewEnabled() && !mDisplayPaused) 3034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 3036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 3037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( !mBracketingEnabled ) 3040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 3042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 3045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBracketingRunning = true; 3047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( (NO_ERROR == ret) && ( NULL != mCameraAdapter ) ) 3050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE, 3052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( int ) &frame, 3053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( mBracketRangeNegative + 1 )); 3054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 3056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret); 3058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 3062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mAppCallbackNotifier.get() ) 3064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->setBurst(true); 3066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 3070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mParameters.getPictureSize(( int * ) &frame.mWidth, 3072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( int * ) &frame.mHeight); 3073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = allocImageBufs(frame.mWidth, 3075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame.mHeight, 3076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev frame.mLength, 3077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mParameters.getPictureFormat(), 30781d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu ( mBracketRangeNegative + 1 )); 3079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 308072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng { 3081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret); 308272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 3083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( (NO_ERROR == ret) && ( NULL != mCameraAdapter ) ) 3086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3088f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mBuffers = mImageBuffers; 3089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mOffsets = mImageOffsets; 3090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mFd = mImageFd; 3091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mLength = mImageLength; 3092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mCount = ( size_t ) ( mBracketRangeNegative + 1 ); 30931d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu desc.mMaxQueueable = ( size_t ) ( mBracketRangeNegative + 1 ); 3094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE, 3096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( int ) &desc); 3097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 3099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 3102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //pass capture timestamp along with the camera adapter command 3104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 ), (int) &mStartCapture); 3105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else 3107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_BRACKET_CAPTURE, ( mBracketRangePositive + 1 )); 3109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 3111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 3116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::stopImageBracketing() 3119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 3121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 312488006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman if( !previewEnabled() ) 3125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 3127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 312988006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman mBracketingRunning = false; 313088006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman 313188006b1ebee79cb0f1a2c682258b313eb801049dSundar Raman ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_BRACKET_CAPTURE); 3132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 3134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 3136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 3139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @brief Take a picture. 3140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @param none 3142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @return NO_ERROR If able to switch to image capture 3143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @todo Define error codes if unable to switch to image capture 3144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */ 3146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::takePicture(const char *params) 3147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 3148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 3149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return __takePicture(params); 3150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 3151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/** 3153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @brief Internal function for getting a captured image. 3154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons shared by takePicture and reprocess. 3155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 3156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR If able to switch to image capture 3157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Define error codes if unable to switch to image capture 3158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 3160f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::__takePicture(const char *params) 3161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3162f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // cancel AF state if needed (before any operation and mutex lock) 3163f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mCameraAdapter->getState() == CameraAdapter::AF_STATE) { 3164f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons cancelAutoFocus(); 3165f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3166f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 3168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraFrame frame; 3169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CameraAdapter::BuffersDescriptor desc; 3170f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int burst = -1; 3171ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu const char *valstr = NULL; 3172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev unsigned int bufferCount = 1; 3173f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons unsigned int max_queueable = 0; 3174f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons unsigned int rawBufferCount = 1; 3175f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons bool isCPCamMode = false; 3176ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu android::sp<DisplayAdapter> outAdapter = 0; 3177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 3179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gettimeofday(&mStartCapture, NULL); 3181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 3183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!previewEnabled() && !mDisplayPaused) 3187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 3189ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu CAMHAL_LOGEA("Preview not started..."); 3190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 3191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3193f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = mParameters.get(TICameraParameters::KEY_CAP_MODE); 3194f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3195f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons isCPCamMode = valstr && !strcmp(valstr, TICameraParameters::CP_CAM_MODE); 3196f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3197ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu // return error if we are already capturing 3198f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // however, we can queue a capture when in cpcam mode 3199f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( ((mCameraAdapter->getState() == CameraAdapter::CAPTURE_STATE && 3200ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE) || 3201ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu (mCameraAdapter->getState() == CameraAdapter::VIDEO_CAPTURE_STATE && 3202f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapter->getNextState() != CameraAdapter::VIDEO_STATE)) && 3203f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons !isCPCamMode) { 3204ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu CAMHAL_LOGEA("Already capturing an image..."); 3205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_INIT; 3206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3208ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu // we only support video snapshot if we are in video mode (recording hint is set) 3209ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if ( (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE) && 3210f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (valstr && ( strcmp(valstr, TICameraParameters::VIDEO_MODE) && 3211f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons strcmp(valstr, TICameraParameters::VIDEO_MODE_HQ ) ) ) ) { 3212ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu CAMHAL_LOGEA("Trying to capture while recording without recording hint set..."); 3213ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu return INVALID_OPERATION; 3214ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 3215ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu 3216f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM 3217f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // check if camera application is using shots parameters 3218f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // api. parameters set here override anything set using setParameters 3219f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // TODO(XXX): Just going to use legacy TI parameters for now. Need 3220f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // add new APIs in CameraHal to utilize android::ShotParameters later, so 3221f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // we don't have to parse through the whole set of parameters 3222f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // in camera adapter 3223f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strlen(params) > 0) { 3224f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::ShotParameters shotParams; 3225f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons const char *valStr; 3226f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons const char *valExpComp, *valExpGain; 3227f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int valNum; 3228f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3229f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::String8 shotParams8(params); 3230f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3231f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons shotParams.unflatten(shotParams8); 3232f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE); 3233f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.remove(TICameraParameters::KEY_EXP_BRACKETING_RANGE); 3234f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3235f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valExpGain = shotParams.get(android::ShotParameters::KEY_EXP_GAIN_PAIRS); 3236f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valExpComp = shotParams.get(android::ShotParameters::KEY_EXP_COMPENSATION); 3237f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NULL != valExpComp) { 3238f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_EXP_BRACKETING_RANGE, valExpComp); 3239f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (NULL != valExpGain) { 3240f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_EXP_GAIN_BRACKETING_RANGE, valExpGain); 3241f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3243f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valNum = shotParams.getInt(android::ShotParameters::KEY_BURST); 3244f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valNum >= 0) { 3245f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_BURST, valNum); 3246f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons burst = valNum; 3247f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3248f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3249f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valStr = shotParams.get(android::ShotParameters::KEY_FLUSH_CONFIG); 3250f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valStr!= NULL) { 3251f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( 0 == strcmp(valStr, android::ShotParameters::TRUE) ) { 3252f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_FLUSH_SHOT_CONFIG_QUEUE, 3253f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::TRUE); 3254f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if ( 0 == strcmp(valStr, android::ShotParameters::FALSE) ) { 3255f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(TICameraParameters::KEY_FLUSH_SHOT_CONFIG_QUEUE, 3256f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::FALSE); 3257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3258f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3260f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valStr = shotParams.get(android::ShotParameters::KEY_CURRENT_TAP_OUT); 3261f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valStr != NULL) { 3262f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int index = -1; 3263f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons for (unsigned int i = 0; i < mOutAdapters.size(); i++) { 3264f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(mOutAdapters.itemAt(i)->match(valStr)) { 3265f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons index = i; 3266f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons break; 3267f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3268f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3269f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (index < 0) { 3270f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Invalid tap out surface passed to camerahal"); 3271f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 3272f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3273f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Found matching out adapter at %d", index); 3274ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu outAdapter = mOutAdapters.itemAt(index); 3275f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3276f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3277f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapter->setParameters(mParameters); 3278f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else 3279f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 3280f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 3281f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // TODO(XXX): Should probably reset burst and bracketing params 3282f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // when we remove legacy TI parameters implementation 3283f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3284f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3285f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // if we are already in the middle of a capture...then we just need 3286f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // setParameters and start image capture to queue more shots 3287f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (((mCameraAdapter->getState() & CameraAdapter::CAPTURE_STATE) == 3288f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraAdapter::CAPTURE_STATE) && 3289f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (mCameraAdapter->getNextState() != CameraAdapter::PREVIEW_STATE)) { 3290f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 3291f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons //pass capture timestamp along with the camera adapter command 3292f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE, 3293f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons (int) &mStartCapture); 3294f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#else 3295f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE); 3296f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 3297f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 3298f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3299f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3300f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( !mBracketingRunning ) 3301f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 3302f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // if application didn't set burst through android::ShotParameters 3303f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // then query from TICameraParameters 3304f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((burst == -1) && (NO_ERROR == ret)) { 3305f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons burst = mParameters.getInt(TICameraParameters::KEY_BURST); 3306f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Allocate all buffers only in burst capture case 3309f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( burst > 0 ) { 3310f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // For CPCam mode...allocate for worst case burst 3311f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons bufferCount = isCPCamMode || (burst > CameraHal::NO_BUFFERS_IMAGE_CAPTURE) ? 3312f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraHal::NO_BUFFERS_IMAGE_CAPTURE : burst; 3313f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3314ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu if (outAdapter.get()) { 3315ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu bufferCount = outAdapter->getBufferCount(); 3316ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu if (bufferCount < 1) { 3317ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu bufferCount = NO_BUFFERS_IMAGE_CAPTURE_SYSTEM_HEAP; 3318ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu } 3319f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3320f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3321f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NULL != mAppCallbackNotifier.get() ) { 3322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->setBurst(true); 3323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3324f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if ( mBracketingEnabled ) { 3325f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons bufferCount = mBracketRangeNegative + 1; 3326f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NULL != mAppCallbackNotifier.get() ) { 3327f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mAppCallbackNotifier->setBurst(false); 3328f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3329f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 3330f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NULL != mAppCallbackNotifier.get() ) { 3331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->setBurst(false); 3332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3333f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3335ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu // pause preview during normal image capture 3336ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu // do not pause preview if recording (video state) 3337f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (NO_ERROR == ret) && (NULL != mDisplayAdapter.get()) ) { 3338ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if (mCameraAdapter->getState() != CameraAdapter::VIDEO_STATE) { 3339ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu mDisplayPaused = true; 3340ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu mPreviewEnabled = false; 3341ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu ret = mDisplayAdapter->pauseDisplay(mDisplayPaused); 3342ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu // since preview is paused we should stop sending preview frames too 3343ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) { 3344ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu mAppCallbackNotifier->disableMsgType (CAMERA_MSG_PREVIEW_FRAME); 3345ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 3346ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 3347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 3349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayAdapter->setSnapshotTimeRef(&mStartCapture); 3350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 3351ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu } 3352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3353c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu // if we taking video snapshot... 3354c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if ((NO_ERROR == ret) && (mCameraAdapter->getState() == CameraAdapter::VIDEO_STATE)) { 3355c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu // enable post view frames if not already enabled so we can internally 3356c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu // save snapshot frames for generating thumbnail 3357c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu if((mMsgEnabled & CAMERA_MSG_POSTVIEW_FRAME) == 0) { 3358c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu mAppCallbackNotifier->enableMsgType(CAMERA_MSG_POSTVIEW_FRAME); 3359c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 3360c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu } 3361c160a1f85c70e49a7613d774e2d99035f3cb4851Tyler Luu 3362ee6bb64f60c228d711dc1d6875d8f4b0ed88b6cfTyler Luu if ( (NO_ERROR == ret) && (NULL != mCameraAdapter) ) 3363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 3365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE, 3366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( int ) &frame, 3367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bufferCount); 3368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR != ret ) 3370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("CAMERA_QUERY_BUFFER_SIZE_IMAGE_CAPTURE returned error 0x%x", ret); 3372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3375ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu if (outAdapter.get()) { 3376ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu bool reset; 3377ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu // Need to reset buffers if we are switching adapters since we don't know 3378ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu // the state of the new buffer list 3379ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu reset = (outAdapter.get() != mBufferSourceAdapter_Out.get()); 3380ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu ret = outAdapter->maxQueueableBuffers(max_queueable); 3381ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu if (NO_ERROR != ret) { 3382ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu CAMHAL_LOGE("Couldn't get max queuable"); 3383ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu return ret; 3384ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu } 3385ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu mImageBuffers = outAdapter->getBuffers(reset); 3386ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu mImageOffsets = outAdapter->getOffsets(); 3387ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu mImageFd = outAdapter->getFd(); 3388ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu mImageLength = outAdapter->getSize(); 3389ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu mBufferSourceAdapter_Out = outAdapter; 3390ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu } else { 3391ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu mBufferSourceAdapter_Out.clear(); 3392ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu // allocImageBufs will only allocate new buffers if mImageBuffers is NULL 3393ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu if ( NO_ERROR == ret ) { 3394ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu max_queueable = bufferCount; 3395ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu ret = allocImageBufs(frame.mAlignment / getBPP(mParameters.getPictureFormat()), 3396ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu frame.mHeight, 3397ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu frame.mLength, 3398ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu mParameters.getPictureFormat(), 3399ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu bufferCount); 3400ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu if ( NO_ERROR != ret ) { 3401ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu CAMHAL_LOGEB("allocImageBufs returned error 0x%x", ret); 3402ffc1968e8c1188095c0d8d6b5379abdc7a06c9bdTyler Luu } 3403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 34041d40b78f3a968634194f0c1d878d1ba122f435d7Tyler Luu } 3405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( (NO_ERROR == ret) && ( NULL != mCameraAdapter ) ) 3407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3408f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mBuffers = mImageBuffers; 3409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mOffsets = mImageOffsets; 3410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mFd = mImageFd; 3411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mLength = mImageLength; 3412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev desc.mCount = ( size_t ) bufferCount; 3413f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mMaxQueueable = ( size_t ) max_queueable; 3414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_IMAGE_CAPTURE, 3416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ( int ) &desc); 3417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3418f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mRawCapture) { 3419f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR == ret ) { 3420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Raw capture buffers setup - %s", mParameters.getPictureFormat()); 3421f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = allocRawBufs(mParameters.getInt(TICameraParameters::RAW_WIDTH), 3422f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.getInt(TICameraParameters::RAW_HEIGHT), 3423f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters::PIXEL_FORMAT_BAYER_RGGB, 3424f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons rawBufferCount); 3425f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3426f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NO_ERROR != ret ) { 3427f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEB("allocRawBufs (for RAW capture) returned error 0x%x", ret); 3428f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3429f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3430f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3431f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((NO_ERROR == ret) && ( NULL != mCameraAdapter )) { 3432f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mBuffers = mVideoBuffers; 3433f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mOffsets = mVideoOffsets; 3434f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mFd = mVideoFd; 3435f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mLength = mVideoLength; 3436f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mCount = ( size_t ) rawBufferCount; 3437f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mMaxQueueable = ( size_t ) rawBufferCount; 3438f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_VIDEO_CAPTURE, 3440f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ( int ) &desc); 3441f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3443f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3445f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((ret == NO_ERROR) && mBufferSourceAdapter_Out.get()) { 3446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mBufferSourceAdapter_Out->enableDisplay(0, 0, NULL); 3447f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3448f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3449f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ((NO_ERROR == ret) && (NULL != mCameraAdapter)) { 3450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 3452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //pass capture timestamp along with the camera adapter command 3454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE, (int) &mStartCapture); 3455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#else 3457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_IMAGE_CAPTURE); 3459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 3461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3462f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 3465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 3468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Cancel a picture that was started with takePicture. 3469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Calling this method when no picture is being taken is a no-op. 3471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 3473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR If cancel succeeded. Cancel can succeed if image callback is not sent 3474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Define error codes 3475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 3477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::cancelPicture( ) 3478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3480f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 3481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3482f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = signalEndImageCapture(); 3483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 3484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 3487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Return the camera parameters. 3488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 3490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return Currently configured camera parameters 3491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 3493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar* CameraHal::getParameters() 3494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3495f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::String8 params_str8; 3496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev char* params_string; 349772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng const char * valstr = NULL; 3498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( NULL != mCameraAdapter ) 3502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3503f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu mCameraAdapter->getParameters(mParameters); 3504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3506f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT)) != NULL ) { 3507f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!strcmp(TICameraParameters::S3D_TB_FULL, valstr)) { 3508f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_TOPBOTTOM_SIZES)); 3509f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (!strcmp(TICameraParameters::S3D_SS_FULL, valstr)) { 3510f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_SIDEBYSIDE_SIZES)); 3511f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if ((!strcmp(TICameraParameters::S3D_TB_SUBSAMPLED, valstr)) 3512f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons || (!strcmp(TICameraParameters::S3D_SS_SUBSAMPLED, valstr))) { 3513f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PICTURE_SUBSAMPLED_SIZES)); 3514f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3515f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3516f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3517f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (valstr = mParameters.get(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT)) != NULL ) { 3518f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!strcmp(TICameraParameters::S3D_TB_FULL, valstr)) { 3519f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES)); 3520f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (!strcmp(TICameraParameters::S3D_SS_FULL, valstr)) { 3521f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES)); 3522f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if ((!strcmp(TICameraParameters::S3D_TB_SUBSAMPLED, valstr)) 3523f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons || (!strcmp(TICameraParameters::S3D_SS_SUBSAMPLED, valstr))) { 3524f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mParameters.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mParameters.get(TICameraParameters::KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES)); 3525f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3526f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3527f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3528f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters mParams = mParameters; 352972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 353072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng // Handle RECORDING_HINT to Set/Reset Video Mode Parameters 3531f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valstr = mParameters.get(android::CameraParameters::KEY_RECORDING_HINT); 353272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng if(valstr != NULL) 353372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng { 3534f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(strcmp(valstr, android::CameraParameters::TRUE) == 0) 353572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng { 353672b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng //HACK FOR MMS MODE 3537f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons resetPreviewRes(&mParams); 353872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 353972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 3540524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman 35419743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu // do not send internal parameters to upper layers 35429743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu mParams.remove(TICameraParameters::KEY_RECORDING_HINT); 3543fd705eb8b757a4f3d1d80b736cf20cade04524d7Tyler Luu mParams.remove(TICameraParameters::KEY_AUTO_FOCUS_LOCK); 35449743353b9dd1da8d1755218a7b961400ce825bd1Tyler Luu 354572b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng params_str8 = mParams.flatten(); 3546524cc0cda6ed8cb07e0469fc931657ac60335aa1Sundar Raman 3547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // camera service frees this string... 3548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev params_string = (char*) malloc(sizeof(char) * (params_str8.length()+1)); 3549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcpy(params_string, params_str8.string()); 3550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 3552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Return the current set of parameters 3554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return params_string; 3556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3558f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3559f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM 3560f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/** 3561f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @brief Starts reprocessing operation. 3562f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */ 3563f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::reprocess(const char *params) 3564f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 3565f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 3566f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int bufferCount = 0; 3567f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraAdapter::BuffersDescriptor desc; 3568f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CameraBuffer *reprocBuffers = NULL; 3569f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::ShotParameters shotParams; 3570f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons const char *valStr = NULL; 3571f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3572f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 3573f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3574f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 3575f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3576f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 0. Get tap in surface 3577f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strlen(params) > 0) { 3578f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::String8 shotParams8(params); 3579f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons shotParams.unflatten(shotParams8); 3580f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3581f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3582f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons valStr = shotParams.get(android::ShotParameters::KEY_CURRENT_TAP_IN); 3583f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (valStr != NULL) { 3584f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int index = -1; 3585f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons for (unsigned int i = 0; i < mInAdapters.size(); i++) { 3586f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(mInAdapters.itemAt(i)->match(valStr)) { 3587f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons index = i; 3588f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons break; 3589f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3590f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3591f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (index < 0) { 3592f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Invalid tap in surface passed to camerahal"); 3593f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 3594f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3595f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGD("Found matching in adapter at %d", index); 3596f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mBufferSourceAdapter_In = mInAdapters.itemAt(index); 3597f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 3598f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("No tap in surface sent with shot config!"); 3599f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return BAD_VALUE; 3600f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3601f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3602f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 1. Get buffers 3603f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (mBufferSourceAdapter_In.get()) { 3604f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons reprocBuffers = mBufferSourceAdapter_In->getBufferList(&bufferCount); 3605f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3606f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3607f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!reprocBuffers) { 3608f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Error: couldn't get input buffers for reprocess()"); 3609f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto exit; 3610f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3611f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3612f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 2. Get buffer information and parse parameters 3613f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 3614f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons shotParams.setBurst(bufferCount); 3615f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3616f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3617f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 3. Give buffer to camera adapter 3618f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mBuffers = reprocBuffers; 3619f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mOffsets = 0; 3620f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mFd = 0; 3621f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mLength = 0; 3622f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mCount = (size_t) bufferCount; 3623f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons desc.mMaxQueueable = (size_t) bufferCount; 3624f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_USE_BUFFERS_REPROCESS, (int) &desc); 3625f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret != NO_ERROR) { 3626f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Error calling camera use buffers"); 3627f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto exit; 3628f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3629f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3630f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 4. Start reprocessing 3631f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mBufferSourceAdapter_In->enableDisplay(0, 0, NULL); 3632f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (ret != NO_ERROR) { 3633f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGE("Error enabling tap in point"); 3634f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons goto exit; 3635f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3636f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3637f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // 5. Start capturing 3638f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = __takePicture(shotParams.flatten().string()); 3639f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3640f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons exit: 3641f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 3642f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 3643f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3644f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons/** 3645f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons @brief Cancels current reprocessing operation 3646f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3647f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons */ 3648f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsstatus_t CameraHal::cancel_reprocess( ) 3649f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 3650f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 3651f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status_t ret = NO_ERROR; 3652f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3653f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = signalEndImageCapture(); 3654f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return NO_ERROR; 3655f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 3656f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 3657f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3658f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::putParameters(char *parms) 3660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev free(parms); 3662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 3665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Send command to camera driver. 3666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 3668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR If the command succeeds 3669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Define the error codes that this function can return 3670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 3672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) 3673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 3675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( ( NO_ERROR == ret ) && ( NULL == mCameraAdapter ) ) 3679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("No CameraAdapter instance"); 3681057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu return -EINVAL; 3682057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu } 3683057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu 3684057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu /////////////////////////////////////////////////////// 3685057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu // Following commands do NOT need preview to be started 3686057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu /////////////////////////////////////////////////////// 3687f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3688f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons switch ( cmd ) { 3689f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef ANDROID_API_JB_OR_LATER 3690f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons case CAMERA_CMD_ENABLE_FOCUS_MOVE_MSG: 3691f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons { 3692f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons const bool enable = static_cast<bool>(arg1); 3693f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::AutoMutex lock(mLock); 3694f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( enable ) { 3695f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mMsgEnabled |= CAMERA_MSG_FOCUS_MOVE; 3696f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 3697f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mMsgEnabled &= ~CAMERA_MSG_FOCUS_MOVE; 3698f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3699f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3700f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return OK; 3701f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 3702057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu } 3703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3704f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( ret == OK && !previewEnabled() 3705f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC 3706f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons && (cmd != CAMERA_CMD_PREVIEW_INITIALIZATION) 3707f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 3708f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ) { 3709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Preview is not running"); 3710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 3711f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3713057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu /////////////////////////////////////////////////////// 3714057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu // Following commands NEED preview to be started 3715057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu /////////////////////////////////////////////////////// 3716057f4fd59ec05ded909e9eb9a3363d9ea345b0caTyler Luu 3717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 3718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev switch(cmd) 3720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CAMERA_CMD_START_SMOOTH_ZOOM: 3722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_SMOOTH_ZOOM, arg1); 3724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 3726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CAMERA_CMD_STOP_SMOOTH_ZOOM: 3727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_SMOOTH_ZOOM); 3729f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons break; 3730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CAMERA_CMD_START_FACE_DETECTION: 3732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_START_FD); 3734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 3736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev case CAMERA_CMD_STOP_FACE_DETECTION: 3738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD); 3740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 3742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3743f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC 3744f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons case CAMERA_CMD_PREVIEW_DEINITIALIZATION: 3745f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(mDisplayAdapter.get() != NULL) { 3746f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ///Stop the buffer display first 3747f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mDisplayAdapter->disableDisplay(); 3748f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3749f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3750f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if(mAppCallbackNotifier.get() != NULL) { 3751f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons //Stop the callback sending 3752f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mAppCallbackNotifier->stop(); 3753f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mAppCallbackNotifier->flushAndReturnFrames(); 3754f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mAppCallbackNotifier->stopPreviewCallbacks(); 3755f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3756f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3757f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = mCameraAdapter->sendCommand(CameraAdapter::CAMERA_DESTROY_TUNNEL); 3758f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mTunnelSetup = false; 3759f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3760f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons break; 3761f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3762f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons case CAMERA_CMD_PREVIEW_INITIALIZATION: 3763f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = cameraPreviewInitialization(); 3764f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3765f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons break; 3766f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 3767f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev default: 3769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 3770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev }; 3771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 3774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 3776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 3779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Release the hardware resources owned by this object. 3780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Note that this is *not* done in the destructor. 3782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 3784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return none 3785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 3787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::release() 3788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@todo Investigate on how release is used by CameraService. Vaguely remember that this is called 3791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///just before CameraHal object destruction 3792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev deinitialize(); 3793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 3794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 3798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Dump state of the camera hardware 3799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] fd File descriptor 3801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param[in] args Arguments 3802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR Dump succeeded 3803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @todo Error codes for dump fail 3804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 3806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::dump(int fd) const 3807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Implement this method when the h/w dump function is supported on Ducati side 3810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 3811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Interface Method definitions ENDS here--------------------*/ 3814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*-------------Camera Hal Internal Method definitions STARTS here--------------------*/ 3819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 3821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Constructor of CameraHal 3822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Member variables are initialized here. No allocations should be done here as we 3824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev don't use c++ exceptions in the code. 3825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 3827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::CameraHal(int cameraId) 3828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Initialize all the member variables to their defaults 3832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewEnabled = false; 3833f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewBuffers = NULL; 3834f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mImageBuffers = NULL; 3835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBufProvider = NULL; 3836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewStartInProgress = false; 3837f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVideoBuffers = NULL; 3838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoBufProvider = NULL; 3839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecordingEnabled = false; 3840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayPaused = false; 3841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSetPreviewWindowCalled = false; 3842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMsgEnabled = 0; 3843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier = NULL; 3844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMemoryManager = NULL; 3845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter = NULL; 3846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBracketingEnabled = false; 3847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBracketingRunning = false; 3848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider = NULL; 3849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBracketRangePositive = 1; 3850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mBracketRangeNegative = 1; 3851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMaxZoomSupported = 0; 3852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mShutterEnabled = true; 3853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMeasurementEnabled = false; 3854f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewDataBuffers = NULL; 3855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraProperties = NULL; 3856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCurrentTime = 0; 3857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mFalsePreview = 0; 3858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mImageOffsets = NULL; 3859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mImageLength = 0; 3860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mImageFd = 0; 3861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoOffsets = NULL; 3862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoFd = 0; 3863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mVideoLength = 0; 3864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewDataOffsets = NULL; 3865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewDataFd = 0; 3866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewDataLength = 0; 3867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewFd = 0; 3868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewWidth = 0; 3869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewHeight = 0; 3870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewLength = 0; 3871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewOffsets = NULL; 3872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewRunning = 0; 3873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewStateOld = 0; 3874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecordingEnabled = 0; 3875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mRecordEnabled = 0; 3876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorListener = NULL; 387772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mVideoWidth = 0; 387872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng mVideoHeight = 0; 3879f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_VTC 3880f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mVTCUseCase = false; 3881f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mTunnelSetup = false; 3882f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 3883f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mPreviewInitializationDone = false; 3884f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3885f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMAP_ENHANCEMENT_CPCAM 3886f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mExtendedPreviewStreamOps = 0; 3887f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 3888f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3889f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons //These values depends on the sensor characteristics 3890f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3891f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mRawCapture = false; 3892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS 3894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Initialize the CameraHAL constructor timestamp, which is used in the 3896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // PPM() method as time reference if the user does not supply one. 3897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev gettimeofday(&ppm_start, NULL); 3898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 3900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraIndex = cameraId; 3902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 3904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 3907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Destructor of CameraHal 3908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev This function simply calls deinitialize() to free up memory allocate during construct 3910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev phase 3911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 3912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevCameraHal::~CameraHal() 3913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Call de-initialize here once more - it is the last chance for us to relinquish all the h/w and s/w resources 3917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev deinitialize(); 3918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mEventProvider ) 3920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider->disableEventNotification(CameraHalEvent::ALL_EVENTS); 3922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev delete mEventProvider; 3923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mEventProvider = NULL; 3924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// Free the callback notifier 3927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier.clear(); 3928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// Free the display adapter 3930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayAdapter.clear(); 3931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mCameraAdapter ) { 3933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int strongCount = mCameraAdapter->getStrongCount(); 3934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter->decStrong(mCameraAdapter); 3936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter = NULL; 3938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3940de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman freeImageBufs(); 3941f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons freeRawBufs(); 3942de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman 3943de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman /// Free the memory manager 3944de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman mMemoryManager.clear(); 3945de885009bcb5e9491e6107173e0e03671267a1a9Sundar Raman 3946c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 3947c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 3948c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3949c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 3950c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Initialize the Camera HAL 3951c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3952c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Creates CameraAdapter, AppCallbackNotifier, DisplayAdapter and MemoryManager 3953c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3954c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param None 3955c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return NO_ERROR - On success 3956c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NO_MEMORY - On failure to allocate memory for any of the objects 3957c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @remarks Camera Hal internal function 3958c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3959c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 3960c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3961c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::initialize(CameraProperties::Properties* properties) 3962c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 3963c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 3964c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3965c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int sensor_index = 0; 3966f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons const char* sensor_name = NULL; 3967c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3968c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Initialize the event mask used for registering an event provider for AppCallbackNotifier 3969c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Currently, registering all events as to be coming from CameraAdapter 3970c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int32_t eventMask = CameraHalEvent::ALL_EVENTS; 3971c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3972c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Get my camera properties 3973c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraProperties = properties; 3974c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3975c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mCameraProperties) 3976c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3977c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail_loop; 3978c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3979c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3980c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Dump the properties of this Camera 3981c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // will only print if DEBUG macro is defined 3982c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraProperties->dump(); 3983c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3984c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)) != 0 ) 3985c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 3986c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sensor_index = atoi(mCameraProperties->get(CameraProperties::CAMERA_SENSOR_INDEX)); 3987c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 3988c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 3989f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(CameraProperties::DEFAULT_VALUE, mCameraProperties->get(CameraProperties::CAMERA_NAME)) != 0 ) { 3990f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons sensor_name = mCameraProperties->get(CameraProperties::CAMERA_NAME); 3991f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3992f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGDB("Sensor index= %d; Sensor name= %s", sensor_index, sensor_name); 3993f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 3994f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (strcmp(sensor_name, V4L_CAMERA_NAME_USB) == 0) { 3995f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef V4L_CAMERA_ADAPTER 3996f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapter = V4LCameraAdapter_Factory(sensor_index); 3997f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 3998f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 3999f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons else { 4000f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#ifdef OMX_CAMERA_ADAPTER 4001f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mCameraAdapter = OMXCameraAdapter_Factory(sensor_index); 4002f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons#endif 4003f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4004c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 40059a412956d5327ec851ff8adc3e9804640fa30c7fTyler Luu if ( ( NULL == mCameraAdapter ) || (mCameraAdapter->initialize(properties)!=NO_ERROR)) 4006c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4007c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Unable to create or initialize CameraAdapter"); 4008c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter = NULL; 4009c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail_loop; 4010c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4011c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4012c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter->incStrong(mCameraAdapter); 4013c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter->registerImageReleaseCallback(releaseImageBuffers, (void *) this); 4014c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter->registerEndCaptureCallback(endImageCapture, (void *)this); 4015c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4016c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mAppCallbackNotifier.get()) 4017c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4018c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// Create the callback notifier 4019c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier = new AppCallbackNotifier(); 4020c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( ( NULL == mAppCallbackNotifier.get() ) || ( mAppCallbackNotifier->initialize() != NO_ERROR)) 4021c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4022c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Unable to create or initialize AppCallbackNotifier"); 4023c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail_loop; 4024c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4025c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4026c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4027c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(!mMemoryManager.get()) 4028c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4029c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// Create Memory Manager 4030c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMemoryManager = new MemoryManager(); 4031c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if( ( NULL == mMemoryManager.get() ) || ( mMemoryManager->initialize() != NO_ERROR)) 4032c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4033c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Unable to create or initialize MemoryManager"); 4034c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail_loop; 4035c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4036c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4037c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4038c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Setup the class dependencies... 4039c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4040c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///AppCallbackNotifier has to know where to get the Camera frames and the events like auto focus lock etc from. 4041c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///CameraAdapter is the one which provides those events 4042c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Set it as the frame and event providers for AppCallbackNotifier 4043c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///@remarks setEventProvider API takes in a bit mask of events for registering a provider for the different events 4044c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// That way, if events can come from DisplayAdapter in future, we will be able to add it as provider 4045c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /// for any event 4046c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->setEventProvider(eventMask, mCameraAdapter); 4047c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->setFrameProvider(mCameraAdapter); 4048c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4049c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Any dynamic errors that happen during the camera use case has to be propagated back to the application 4050c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///via CAMERA_MSG_ERROR. AppCallbackNotifier is the class that notifies such errors to the application 4051c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Set it as the error handler for CameraAdapter 4052c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mCameraAdapter->setErrorHandler(mAppCallbackNotifier.get()); 4053c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4054c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Start the callback notifier 4055c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mAppCallbackNotifier->start() != NO_ERROR) 4056c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4057c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Couldn't start AppCallbackNotifier"); 4058c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto fail_loop; 4059c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4060c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4061c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGDA("Started AppCallbackNotifier.."); 4062c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->setMeasurements(mMeasurementEnabled); 4063c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4064c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Initialize default parameters 4065c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev initDefaultParameters(); 4066c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4067c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4068c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( setParameters(mParameters) != NO_ERROR ) 4069c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4070c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Failed to set default parameters?!"); 4071c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4072c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4073c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // register for sensor events 4074c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorListener = new SensorListener(); 4075c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (mSensorListener.get()) { 4076c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (mSensorListener->initialize() == NO_ERROR) { 4077c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorListener->setCallbacks(orientation_cb, this); 4078c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorListener->enableSensor(SensorListener::SENSOR_ORIENTATION); 4079c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else { 4080c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error initializing SensorListener. not fatal, continuing"); 4081c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorListener.clear(); 4082c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorListener = NULL; 4083c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4084c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4085c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4086c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 4087c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4088c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_ERROR; 4089c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4090c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev fail_loop: 4091c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4092c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Free up the resources because we failed somewhere up 4093c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev deinitialize(); 4094c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 4095c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4096c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return NO_MEMORY; 4097c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4098c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 4099c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isResolutionValid(unsigned int width, unsigned int height, const char *supportedResolutions) 4101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 4102f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons bool ret = false; 4103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t status = NO_ERROR; 4104f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons char tmpBuffer[MAX_PROP_VALUE_LENGTH]; 4105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev char *pos = NULL; 4106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 4108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4109f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NULL == supportedResolutions) { 4110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid supported resolutions string"); 4111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto exit; 4112f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4114f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status = snprintf(tmpBuffer, MAX_PROP_VALUE_LENGTH - 1, "%dx%d", width, height); 4115f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (0 > status) { 4116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error encountered while generating validation string"); 4117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto exit; 4118f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4120f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = isParameterValid(tmpBuffer, supportedResolutions); 4121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit: 4123f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 4124f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4125f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return ret; 4126f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} 4127f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4128f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsbool CameraHal::isFpsRangeValid(int fpsMin, int fpsMax, const char *supportedFpsRanges) 4129f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons{ 4130f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons bool ret = false; 4131f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons char supported[MAX_PROP_VALUE_LENGTH]; 4132f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons char *pos; 4133f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int suppFpsRangeArray[2]; 4134f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons int i = 0; 4135f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4136f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 4137f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4138f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NULL == supportedFpsRanges ) { 4139f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGEA("Invalid supported FPS ranges string"); 4140f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return false; 4141f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4142f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4143f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (fpsMin <= 0 || fpsMax <= 0 || fpsMin > fpsMax) { 4144f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return false; 4145f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4146f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4147f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons strncpy(supported, supportedFpsRanges, MAX_PROP_VALUE_LENGTH); 4148f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pos = strtok(supported, " (,)"); 4149f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons while (pos != NULL) { 4150f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons suppFpsRangeArray[i] = atoi(pos); 4151f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (i++) { 4152f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (fpsMin >= suppFpsRangeArray[0] && fpsMax <= suppFpsRangeArray[1]) { 4153f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = true; 4154f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons break; 4155f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4156f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons i = 0; 4157f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4158f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pos = strtok(NULL, " (,)"); 4159f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 4162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 4164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 4165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(const char *param, const char *supportedParams) 4167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 4168f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons bool ret = false; 4169f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons char *pos; 4170f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons char supported[MAX_PROP_VALUE_LENGTH]; 4171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 4173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4174f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NULL == supportedParams) { 4175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid supported parameters string"); 4176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto exit; 4177f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4179f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NULL == param) { 4180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid parameter string"); 4181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto exit; 4182f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4184f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons strncpy(supported, supportedParams, MAX_PROP_VALUE_LENGTH - 1); 4185f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4186f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pos = strtok(supported, ","); 4187f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons while (pos != NULL) { 4188f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (!strcmp(pos, param)) { 4189f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = true; 4190f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons break; 4191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4192f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pos = strtok(NULL, ","); 4193f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4194c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4195c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit: 4196c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 4197c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 4199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 4200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevbool CameraHal::isParameterValid(int param, const char *supportedParams) 4202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 4203f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons bool ret = false; 4204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t status; 4205f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons char tmpBuffer[MAX_PROP_VALUE_LENGTH]; 4206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 4208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4209f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (NULL == supportedParams) { 4210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Invalid supported parameters string"); 4211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto exit; 4212f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4214f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons status = snprintf(tmpBuffer, MAX_PROP_VALUE_LENGTH - 1, "%d", param); 4215f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (0 > status) { 4216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEA("Error encountered while generating validation string"); 4217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto exit; 4218f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4220f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons ret = isParameterValid(tmpBuffer, supportedParams); 4221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevexit: 4223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 4224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 4226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 4227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4228f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luustatus_t CameraHal::doesSetParameterNeedUpdate(const char* new_param, const char* old_param, bool& update) { 4229f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu if (!new_param || !old_param) { 4230f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu return -EINVAL; 4231f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu } 4232f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu 4233f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu // if params mismatch we should update parameters for camera adapter 4234f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu if ((strcmp(new_param, old_param) != 0)) { 4235f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu update = true; 4236f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu } 4237f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu 4238f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu return NO_ERROR; 4239f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu} 4240f4260660c494005dc6556698765fe3f3a0d97f60Tyler Luu 4241c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::parseResolution(const char *resStr, int &width, int &height) 4242c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 4243c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 4244c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev char *ctx, *pWidth, *pHeight; 4245c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *sep = "x"; 4246c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4247c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 4248c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4249c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL == resStr ) 4250c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4251c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return -EINVAL; 4252c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4253c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4254c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //This fixes "Invalid input resolution" 4255c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev char *resStr_copy = (char *)malloc(strlen(resStr) + 1); 4256f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( NULL != resStr_copy ) 4257c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4258c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcpy(resStr_copy, resStr); 4259f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons pWidth = strtok_r(resStr_copy, sep, &ctx); 4260c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4261c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != pWidth ) 4262c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4263c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev width = atoi(pWidth); 4264c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4265c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 4266c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4267c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Invalid input resolution %s", resStr); 4268c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 4269c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4270c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4271c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4272c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 4273c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pHeight = strtok_r(NULL, sep, &ctx); 4275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != pHeight ) 4277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev height = atoi(pHeight); 4279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 4281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CAMHAL_LOGEB("Invalid input resolution %s", resStr); 4283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = -EINVAL; 4284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4287f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons free(resStr_copy); 4288f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons resStr_copy = NULL; 4289f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 4291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return ret; 4293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 4294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::insertSupportedParams() 4296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 4297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 4298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4299f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters &p = mParameters; 4300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Set the name of the camera 4302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_CAMERA_NAME, mCameraProperties->get(CameraProperties::CAMERA_NAME)); 4303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mMaxZoomSupported = atoi(mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES)); 4305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4306f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIZES)); 4307f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_FORMATS)); 4308f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIZES)); 4309f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FORMATS)); 4310f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_SUBSAMPLED_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SUBSAMPLED_SIZES)); 4311f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_SIDEBYSIDE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_SIDEBYSIDE_SIZES)); 4312f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_PICTURE_TOPBOTTOM_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PICTURE_TOPBOTTOM_SIZES)); 4313f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_SUBSAMPLED_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SUBSAMPLED_SIZES)); 4314f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_SIDEBYSIDE_SIZES)); 4315f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_PREVIEW_TOPBOTTOM_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_TOPBOTTOM_SIZES)); 4316f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES)); 4317f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_FRAMERATES_EXT_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES_EXT)); 4318f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_SUPPORTED)); 4319f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_FRAMERATE_RANGES_EXT_SUPPORTED, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE_EXT_SUPPORTED)); 4320f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, mCameraProperties->get(CameraProperties::SUPPORTED_THUMBNAIL_SIZES)); 4321f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_WHITE_BALANCE, mCameraProperties->get(CameraProperties::SUPPORTED_WHITE_BALANCE)); 4322f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_EFFECTS, mCameraProperties->get(CameraProperties::SUPPORTED_EFFECTS)); 4323f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_SCENE_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_SCENE_MODES)); 4324f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_FLASH_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FLASH_MODES)); 4325f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_FOCUS_MODES, mCameraProperties->get(CameraProperties::SUPPORTED_FOCUS_MODES)); 4326f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SUPPORTED_ANTIBANDING, mCameraProperties->get(CameraProperties::SUPPORTED_ANTIBANDING)); 4327f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MAX)); 4328f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::SUPPORTED_EV_MIN)); 4329f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_EV_STEP)); 4330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_SUPPORTED_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_EXPOSURE_MODES)); 4331f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN)); 4332f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MAX)); 4333f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_EXPOSURE_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_STEP)); 4334f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN)); 4335f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MAX)); 4336f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_GAIN_ISO_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_STEP)); 4337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_SUPPORTED_ISO_VALUES, mCameraProperties->get(CameraProperties::SUPPORTED_ISO_VALUES)); 4338f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_ZOOM_RATIOS, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_RATIOS)); 4339f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_MAX_ZOOM, mCameraProperties->get(CameraProperties::SUPPORTED_ZOOM_STAGES)); 4340f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::ZOOM_SUPPORTED)); 4341f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED, mCameraProperties->get(CameraProperties::SMOOTH_ZOOM_SUPPORTED)); 4342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_SUPPORTED_IPP, mCameraProperties->get(CameraProperties::SUPPORTED_IPP_MODES)); 4343f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT_VALUES, mCameraProperties->get(CameraProperties::S3D_PRV_FRAME_LAYOUT_VALUES)); 4344f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT_VALUES, mCameraProperties->get(CameraProperties::S3D_CAP_FRAME_LAYOUT_VALUES)); 4345f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE_VALUES, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE_VALUES)); 4346f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_MIN, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MIN)); 4347f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_MAX, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_MAX)); 4348f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_SUPPORTED_MANUAL_CONVERGENCE_STEP, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_CONVERGENCE_STEP)); 4349f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED, mCameraProperties->get(CameraProperties::VSTAB_SUPPORTED)); 4350f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_VNF_SUPPORTED, mCameraProperties->get(CameraProperties::VNF_SUPPORTED)); 4351f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK_SUPPORTED)); 4352f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK_SUPPORTED)); 4353f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED, mCameraProperties->get(CameraProperties::VIDEO_SNAPSHOT_SUPPORTED)); 4354f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED, mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION_SUPPORTED)); 4355f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_CAP_MODE_VALUES, mCameraProperties->get(CameraProperties::CAP_MODE_VALUES)); 4356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 4358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 4360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::initDefaultParameters() 4362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 4363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Purpose of this function is to initialize the default current and supported parameters for the currently 4364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //selected camera. 4365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4366f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons android::CameraParameters &p = mParameters; 4367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int currentRevision, adapterRevision; 4368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev status_t ret = NO_ERROR; 4369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int width, height; 4370f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons const char *valstr; 4371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 4373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4374f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons insertSupportedParams(); 4375f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = parseResolution(mCameraProperties->get(CameraProperties::PREVIEW_SIZE), width, height); 4377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 4379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.setPreviewSize(width, height); 4381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 4383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.setPreviewSize(MIN_WIDTH, MIN_HEIGHT); 4385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = parseResolution(mCameraProperties->get(CameraProperties::PICTURE_SIZE), width, height); 4388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 4390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.setPictureSize(width, height); 4392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 4394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.setPictureSize(PICTURE_WIDTH, PICTURE_HEIGHT); 4396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ret = parseResolution(mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_SIZE), width, height); 4399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NO_ERROR == ret ) 4401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4402f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, width); 4403f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, height); 4404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev else 4406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 4407f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH, MIN_WIDTH); 4408f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT, MIN_HEIGHT); 4409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Insert default values 4412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.setPreviewFrameRate(atoi(mCameraProperties->get(CameraProperties::PREVIEW_FRAME_RATE))); 4413f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_PREVIEW_FPS_RANGE, mCameraProperties->get(CameraProperties::FRAMERATE_RANGE)); 4414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.setPreviewFormat(mCameraProperties->get(CameraProperties::PREVIEW_FORMAT)); 4415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.setPictureFormat(mCameraProperties->get(CameraProperties::PICTURE_FORMAT)); 4416f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_JPEG_QUALITY, mCameraProperties->get(CameraProperties::JPEG_QUALITY)); 4417f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_WHITE_BALANCE, mCameraProperties->get(CameraProperties::WHITEBALANCE)); 4418f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_EFFECT, mCameraProperties->get(CameraProperties::EFFECT)); 4419f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_ANTIBANDING, mCameraProperties->get(CameraProperties::ANTIBANDING)); 4420f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_FLASH_MODE, mCameraProperties->get(CameraProperties::FLASH_MODE)); 4421f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_FOCUS_MODE, mCameraProperties->get(CameraProperties::FOCUS_MODE)); 4422f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_EXPOSURE_COMPENSATION, mCameraProperties->get(CameraProperties::EV_COMPENSATION)); 4423f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_SCENE_MODE, mCameraProperties->get(CameraProperties::SCENE_MODE)); 4424f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_ZOOM, mCameraProperties->get(CameraProperties::ZOOM)); 4425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_CONTRAST, mCameraProperties->get(CameraProperties::CONTRAST)); 4426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_SATURATION, mCameraProperties->get(CameraProperties::SATURATION)); 4427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_BRIGHTNESS, mCameraProperties->get(CameraProperties::BRIGHTNESS)); 4428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_SHARPNESS, mCameraProperties->get(CameraProperties::SHARPNESS)); 4429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_EXPOSURE_MODE, mCameraProperties->get(CameraProperties::EXPOSURE_MODE)); 4430f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_MANUAL_EXPOSURE, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN)); 4431f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_MANUAL_EXPOSURE_RIGHT, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_EXPOSURE_MIN)); 4432f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_MANUAL_GAIN_ISO, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN)); 4433f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_MANUAL_GAIN_ISO_RIGHT, mCameraProperties->get(CameraProperties::SUPPORTED_MANUAL_GAIN_ISO_MIN)); 4434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_ISO, mCameraProperties->get(CameraProperties::ISO_MODE)); 4435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_IPP, mCameraProperties->get(CameraProperties::IPP)); 4436d054c26243e4cf49e5fe04789e4437e5e0f3f574Sundar Raman p.set(TICameraParameters::KEY_GBCE, mCameraProperties->get(CameraProperties::GBCE)); 4437f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_GBCE_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_GBCE)); 4438f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_GLBCE, mCameraProperties->get(CameraProperties::GLBCE)); 4439f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_GLBCE_SUPPORTED, mCameraProperties->get(CameraProperties::SUPPORTED_GLBCE)); 4440f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_S3D_PRV_FRAME_LAYOUT, mCameraProperties->get(CameraProperties::S3D_PRV_FRAME_LAYOUT)); 4441f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT, mCameraProperties->get(CameraProperties::S3D_CAP_FRAME_LAYOUT)); 4442f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_AUTOCONVERGENCE_MODE, mCameraProperties->get(CameraProperties::AUTOCONVERGENCE_MODE)); 4443f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_MANUAL_CONVERGENCE, mCameraProperties->get(CameraProperties::MANUAL_CONVERGENCE)); 4444f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_VIDEO_STABILIZATION, mCameraProperties->get(CameraProperties::VSTAB)); 4445f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_VNF, mCameraProperties->get(CameraProperties::VNF)); 4446f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_FOCAL_LENGTH, mCameraProperties->get(CameraProperties::FOCAL_LENGTH)); 4447f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::HOR_ANGLE)); 4448f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_VERTICAL_VIEW_ANGLE, mCameraProperties->get(CameraProperties::VER_ANGLE)); 4449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_SENSOR_ORIENTATION, mCameraProperties->get(CameraProperties::SENSOR_ORIENTATION)); 4450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_EXIF_MAKE, mCameraProperties->get(CameraProperties::EXIF_MAKE)); 4451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev p.set(TICameraParameters::KEY_EXIF_MODEL, mCameraProperties->get(CameraProperties::EXIF_MODEL)); 4452f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY, mCameraProperties->get(CameraProperties::JPEG_THUMBNAIL_QUALITY)); 4453f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_VIDEO_FRAME_FORMAT, "OMX_TI_COLOR_FormatYUV420PackedSemiPlanar"); 4454f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW, mCameraProperties->get(CameraProperties::MAX_FD_HW_FACES)); 4455f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW, mCameraProperties->get(CameraProperties::MAX_FD_SW_FACES)); 4456f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_MECHANICAL_MISALIGNMENT_CORRECTION, mCameraProperties->get(CameraProperties::MECHANICAL_MISALIGNMENT_CORRECTION)); 4457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // Only one area a.k.a Touch AF for now. 4458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // TODO: Add support for multiple focus areas. 4459f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, mCameraProperties->get(CameraProperties::MAX_FOCUS_AREAS)); 4460f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_AUTO_EXPOSURE_LOCK, mCameraProperties->get(CameraProperties::AUTO_EXPOSURE_LOCK)); 4461f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK, mCameraProperties->get(CameraProperties::AUTO_WHITEBALANCE_LOCK)); 4462f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(android::CameraParameters::KEY_MAX_NUM_METERING_AREAS, mCameraProperties->get(CameraProperties::MAX_NUM_METERING_AREAS)); 4463f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::RAW_WIDTH, mCameraProperties->get(CameraProperties::RAW_WIDTH)); 4464f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::RAW_HEIGHT,mCameraProperties->get(CameraProperties::RAW_HEIGHT)); 4465f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4466f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // TI extensions for enable/disable algos 4467f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Hadcoded for now 4468f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_ALGO_FIXED_GAMMA, android::CameraParameters::TRUE); 4469f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_ALGO_NSF1, android::CameraParameters::TRUE); 4470f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_ALGO_NSF2, android::CameraParameters::TRUE); 4471f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_ALGO_SHARPENING, android::CameraParameters::TRUE); 4472f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_ALGO_THREELINCOLORMAP, android::CameraParameters::TRUE); 4473f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons p.set(TICameraParameters::KEY_ALGO_GIC, android::CameraParameters::TRUE); 4474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 4476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 4477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 4479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Stop a previously started preview. 4480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 4481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return none 4482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 4484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::forceStopPreview() 4485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 4486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 4487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev // stop bracketing if it is running 4489f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( mBracketingRunning ) { 4490f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons stopImageBracketing(); 4491f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 4492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mDisplayAdapter.get() != NULL) { 4494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ///Stop the buffer display first 4495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayAdapter->disableDisplay(); 4496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(mAppCallbackNotifier.get() != NULL) { 4499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev //Stop the callback sending 4500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->stop(); 450126d9a9166b81616d205eb9ebb49c18dac1f6c044Tyler Luu mAppCallbackNotifier->flushAndReturnFrames(); 4502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mAppCallbackNotifier->stopPreviewCallbacks(); 4503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if ( NULL != mCameraAdapter ) { 4506342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu // only need to send these control commands to state machine if we are 4507342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu // passed the LOADED_PREVIEW_STATE 4508a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu if (mCameraAdapter->getState() > CameraAdapter::LOADED_PREVIEW_STATE) { 4509342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu // according to javadoc...FD should be stopped in stopPreview 4510342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu // and application needs to call startFaceDection again 4511342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu // to restart FD 4512342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu mCameraAdapter->sendCommand(CameraAdapter::CAMERA_STOP_FD); 4513342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu } 4514342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu 4515a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu mCameraAdapter->rollbackToInitializedState(); 4516a58c483de2c8188e41fd9635042c31820d13b845Tyler Luu 4517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev freePreviewBufs(); 4520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev freePreviewDataBufs(); 4521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mPreviewEnabled = false; 4523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mDisplayPaused = false; 4524342adfa1cc708708ddfc167d06b2345fcaa8b0e5Tyler Luu mPreviewStartInProgress = false; 4525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 4527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 4528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** 4530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @brief Deallocates memory for all the resources held by Camera HAL. 4531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev Frees the following objects- CameraAdapter, AppCallbackNotifier, DisplayAdapter, 4533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev and Memory Manager 4534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @param none 4536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev @return none 4537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 4539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid CameraHal::deinitialize() 4540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 4541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 4542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4543f5094850dd99854af026e16bd21d8555a5168afbSundar Raman if ( mPreviewEnabled || mDisplayPaused ) { 4544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev forceStopPreview(); 4545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSetPreviewWindowCalled = false; 4548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (mSensorListener.get()) { 4550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorListener->disableSensor(SensorListener::SENSOR_ORIENTATION); 4551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorListener.clear(); 4552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev mSensorListener = NULL; 4553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 4554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4555f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mBufferSourceAdapter_Out.clear(); 4556f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mBufferSourceAdapter_In.clear(); 4557f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mOutAdapters.clear(); 4558f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons mInAdapters.clear(); 4559f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 4561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 4563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatus_t CameraHal::storeMetaDataInBuffers(bool enable) 4565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 4566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME; 4567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return mAppCallbackNotifier->useMetaDataBufferMode(enable); 4569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev LOG_FUNCTION_NAME_EXIT; 4571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 4572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 4573f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid CameraHal::getPreferredPreviewRes(int *width, int *height) 4574a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng{ 4575f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME; 4576a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng 4577f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // We request Ducati for a higher resolution so preview looks better and then downscale the frame before the callback. 4578f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // TODO: This should be moved to configuration constants and boolean flag whether to provide such optimization 4579f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons // Also consider providing this configurability of the desired display resolution from the application 4580f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( ( *width == 320 ) && ( *height == 240 ) ) { 4581f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons *width = 640; 4582f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons *height = 480; 4583f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if ( ( *width == 176 ) && ( *height == 144 ) ) { 4584f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons *width = 704; 4585f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons *height = 576; 4586a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng } 4587a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng 4588f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons LOG_FUNCTION_NAME_EXIT; 4589a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng} 4590a5263e55084368d67ad6a08bae59a6d910e756e9Akwasi Boateng 4591f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid CameraHal::resetPreviewRes(android::CameraParameters *params) 459272b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{ 459372b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng LOG_FUNCTION_NAME; 459472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 4595f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if ( (mVideoWidth <= 320) && (mVideoHeight <= 240)){ 4596f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons params->setPreviewSize(mVideoWidth, mVideoHeight); 459772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng } 459872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 459972b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng LOG_FUNCTION_NAME_EXIT; 460072b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng} 460172b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 4602f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonsvoid * 4603f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmonscamera_buffer_get_omx_ptr (CameraBuffer *buffer) 460472b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng{ 4605f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGV("buffer_type %d opaque %p", buffer->type, buffer->opaque); 4606f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons 4607f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons if (buffer->type == CAMERA_BUFFER_ANW) { 4608f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons buffer_handle_t *handle = (buffer_handle_t *)buffer->opaque; 4609f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGV("anw %08x", *handle); 4610f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return (void *)*handle; 4611f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else if (buffer->type == CAMERA_BUFFER_ION) { 4612f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return (void *)buffer->fd; 4613f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } else { 4614f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons CAMHAL_LOGV("other %08x", buffer->opaque); 4615f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons return (void *)buffer->opaque; 4616f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons } 461772b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng} 461872b0d2814165e633385bd87a838fc9c3a8250113Akwasi Boateng 4619f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Camera 4620f7a4d11e9f710e2cd0592310ac1baecccb85f1d1Jason Simmons} // namespace Ti 4621