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