QCamera3HWI.cpp revision 662d6f3c8101a94f45f3b0f892817e062a5c0faa
1625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 2625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 3625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* Redistribution and use in source and binary forms, with or without 4625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* modification, are permitted provided that the following conditions are 5625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* met: 6625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Redistributions of source code must retain the above copyright 7625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* notice, this list of conditions and the following disclaimer. 8625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Redistributions in binary form must reproduce the above 9625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* copyright notice, this list of conditions and the following 10625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* disclaimer in the documentation and/or other materials provided 11625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* with the distribution. 12625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Neither the name of The Linux Foundation nor the names of its 13625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* contributors may be used to endorse or promote products derived 14625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* from this software without specific prior written permission. 15625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 16625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 28625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*/ 29625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 30625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define LOG_TAG "QCamera3HWI" 31625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <cutils/properties.h> 33625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h> 34625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <camera/CameraMetadata.h> 35625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <stdlib.h> 36625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h> 37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h> 38e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <ui/Fence.h> 39625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h> 40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h" 41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h" 42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h" 43625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android; 45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang//using namespace android; 47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera { 48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 49625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS]; 5080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings; 51625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangconst camera_metadata_t *gStaticMetadata; 52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 53662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = { 54662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_OFF, CAM_EFFECT_MODE_OFF }, 55662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_MONO, CAM_EFFECT_MODE_MONO }, 56662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE, CAM_EFFECT_MODE_NEGATIVE }, 57662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE, CAM_EFFECT_MODE_SOLARIZE }, 58662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SEPIA, CAM_EFFECT_MODE_SEPIA }, 59662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE, CAM_EFFECT_MODE_POSTERIZE }, 60662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD }, 61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD }, 62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_AQUA, CAM_EFFECT_MODE_AQUA } 63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = { 66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_AUTO, CAM_WB_MODE_AUTO }, 67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_INCANDESCENT, CAM_WB_MODE_INCANDESCENT }, 68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_FLUORESCENT, CAM_WB_MODE_FLUORESCENT }, 69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT}, 70662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_DAYLIGHT, CAM_WB_MODE_DAYLIGHT }, 71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT }, 72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_TWILIGHT, CAM_WB_MODE_TWILIGHT }, 73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_SHADE, CAM_WB_MODE_SHADE } 74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = { 77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED, CAM_SCENE_MODE_OFF }, 78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_ACTION, CAM_SCENE_MODE_ACTION }, 79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PORTRAIT, CAM_SCENE_MODE_PORTRAIT }, 80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE, CAM_SCENE_MODE_LANDSCAPE }, 81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT, CAM_SCENE_MODE_NIGHT }, 82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT }, 83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_THEATRE, CAM_SCENE_MODE_THEATRE }, 84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BEACH, CAM_SCENE_MODE_BEACH }, 85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SNOW, CAM_SCENE_MODE_SNOW }, 86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SUNSET, CAM_SCENE_MODE_SUNSET }, 87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO, CAM_SCENE_MODE_ANTISHAKE }, 88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_FIREWORKS , CAM_SCENE_MODE_FIREWORKS }, 89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SPORTS , CAM_SCENE_MODE_SPORTS }, 90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PARTY, CAM_SCENE_MODE_PARTY }, 91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT, CAM_SCENE_MODE_CANDLELIGHT }, 92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BARCODE, CAM_SCENE_MODE_OFF} 93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = { 96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_AUTO, CAM_FOCUS_MODE_AUTO }, 97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_MACRO, CAM_FOCUS_MODE_MACRO }, 98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_EDOF, CAM_FOCUS_MODE_EDOF }, 99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE }, 100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO, CAM_FOCUS_MODE_CONTINOUS_VIDEO } 101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = { 104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, CAM_ANTIBANDING_MODE_OFF }, 105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ }, 106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ }, 107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO } 108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AUTO_EXPOSURE_MAP[] = { 111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_MODE_OFF, CAM_AEC_MODE_FRAME_AVERAGE }, 112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_MODE_ON, CAM_AEC_MODE_FRAME_AVERAGE }, 113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = { 116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_OFF, CAM_FLASH_MODE_OFF }, 117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_ON }, 118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH} 119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 120662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = { 123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang initialize: QCamera3HardwareInterface::initialize, 124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang configure_streams: QCamera3HardwareInterface::configure_streams, 125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang register_stream_buffers: QCamera3HardwareInterface::register_stream_buffers, 126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings, 127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang process_capture_request: QCamera3HardwareInterface::process_capture_request, 128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang get_metadata_vendor_tag_ops: QCamera3HardwareInterface::get_metadata_vendor_tag_ops, 129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang dump: QCamera3HardwareInterface::dump, 130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; 131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3HardwareInterface 135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface 137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera ID 140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId) 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang : mCameraId(cameraId), 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle(NULL), 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened(false), 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCallbackOps(NULL) 148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 150e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0; 151e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.close = close_camera_device; 152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.ops = &mCameraOps; 153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.priv = this; 154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->version = CAM_HAL_V3; 1559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_init(&mRequestLock, NULL); 1579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_init(&mRequestCond, NULL); 1589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 159e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 160e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_init(&mMutex, NULL); 161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: destructor of QCamera2HardwareInterface 167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang closeCamera(); 175e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 176e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mRequestLock); 177e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_cond_destroy(&mRequestCond); 178e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 179e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mMutex); 180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //int rc = NO_ERROR; 197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc == 0) 205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang else 207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : sendCaptureResult 263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: send completed capture result metadata buffer along with possibly 265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * completed output stream buffers to the framework 266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::sendCaptureResult(const struct camera3_callback_ops *, 272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_capture_result_t *result) 273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO - Implement 275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : notify 279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Asynchronous notification callback to framework 281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::notify(const struct camera3_callback_ops *, 290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_notify_msg_t *msg) 291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO - Implement 293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 312e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 313e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Create metadata channel and initialize it 315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 316e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraHandle->ops, captureResultCb, 317e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this); 318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mMetadataChannel == NULL) { 319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to allocate metadata channel", __func__); 3209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = -ENOMEM; 3219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err1; 3229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 3239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = mMetadataChannel->initialize(); 3249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 3259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: metadata channel initialization failed", __func__); 3269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err2; 3279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 3289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 3299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Initialize parameter heap and structure */ 3309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap = new QCamera3HeapMemory(); 3319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (mParamHeap == NULL) { 3329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: creation of mParamHeap failed", __func__); 3339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err2; 334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 335e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 3369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 3379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: allocation of mParamHeap failed", __func__); 3389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err3; 3399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 3409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 3419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF, 3429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap->getFd(0), sizeof(parm_buffer_t)); 3439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 3449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: map_buf failed for mParamHeap", __func__); 3459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err4; 3469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 3479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParameters = (parm_buffer_t *)DATA_PTR(mParamHeap, 0); 3489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 3499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCallbackOps = callback_ops; 350e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 351e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 3529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 3539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 3549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr4: 3559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap->deallocate(); 3569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr3: 3579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mParamHeap; 3589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap = NULL; 3599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr2: 3609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mMetadataChannel; 3619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMetadataChannel = NULL; 3629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1: 363e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 3649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 382e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 383e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 387e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 393e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 400e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *inputStream = NULL; 405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT) { 408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 410e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* TODO: Clean up no longer used streams, and maintain others if this 419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * is not the 1st time configureStreams is called */ 420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMetadataChannel->stop(); 422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_INPUT: 431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_BIDIRECTIONAL: 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang GRALLOC_USAGE_HW_CAMERA_WRITE; 437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_OUTPUT: 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 454e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraHandle->ops, captureResultCb, 455e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this, newStream); 456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (channel == NULL) { 457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: allocation of channel failed", __func__); 458e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->priv = channel; 463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case HAL_PIXEL_FORMAT_BLOB: 465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel = new QCamera3PicChannel(mCameraHandle->camera_handle, 466e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraHandle->ops, captureResultCb, 467e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this, newStream); 468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (channel == NULL) { 469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: allocation of channel failed", __func__); 470e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 474625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->priv = channel; 475625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 476625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 477625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO: Add support for app consumed format? 478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 479625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 4889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 4899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Cannot reuse settings across configure call 4909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 491e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 492625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return 0; 493625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 496e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : validateCaptureRequest 497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 498e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service 49980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 50080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 50180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 50280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 50380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 50480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 50580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 506e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest( 5079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 50880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 50980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = NO_ERROR; 5109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 5119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 5129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 5139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 5159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 5169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 5179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 5219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 5229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 5239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 5249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 5259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 5289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 5299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 5309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 5339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //TODO 5349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Not supporting input buffer yet", __func__); 5359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 5399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 5409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 5419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 5429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 5439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 5449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 5459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 5469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 5499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 5509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 5519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 5549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 5559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 5569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 5599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 5609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 5619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 5649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 5659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 5669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 567e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 568e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 569e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 570e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 571e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : registerStreamBuffers 572e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 573e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 574e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 575e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 576e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @stream_list : streams to be configured 577e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 578e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 579e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 580e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 581e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 582e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 583e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 584e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = 0; 585e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 586e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 587e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 588e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set == NULL) { 589e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 590e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 591e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 592e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 593e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->stream == NULL) { 594e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 595e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 596e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 597e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 598e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->num_buffers < 1) { 599e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 600e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 601e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 602e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 603e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->buffers == NULL) { 604e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 605e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 606e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 607e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 608e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 609e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 610e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 611e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 612e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (stream->stream_type != CAMERA3_STREAM_OUTPUT) { 613e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: not yet support non output type stream", __func__); 614e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 615e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 616e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 617e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 618e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 619e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 620e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 621e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENODEV; 622e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 623e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 624e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 625e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 626e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 627e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 628e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 629e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : processCaptureRequest 630e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 631e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service 632e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 633e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 634e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @request : request from framework to process 635e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 636e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 637e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 638e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 639e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 640e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_request_t *request) 641e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 642e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = NO_ERROR; 643e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ssize_t idx = 0; 644e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t *b; 645e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata meta; 646e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 647e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 648e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 649e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = validateCaptureRequest(request); 650e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != NO_ERROR) { 651e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: incoming request is not valid", __func__); 652e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 653e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 654e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 655e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 656e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frameNumber = request->frame_number; 657e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 658662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = setFrameParameters(request->frame_number, request->settings); 659662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 6609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 6619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: fail to set frame parameters", __func__); 662e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 6639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 6649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // Acquire all request buffers first 667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 669e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang sp<Fence> acquireFence = new Fence(output.acquire_fence); 670e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 671e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != OK) { 672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: fence wait failed %d", __func__, rc); 673e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 674e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 675e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 676e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 677e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 6789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 679e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMetadataChannel->request(NULL, frameNumber); 6809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 6829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 6839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 6849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 6859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 6869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 6879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 6889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 690e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->request(output.buffer, frameNumber); 6919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 6929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 6969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_lock(&mRequestLock); 6979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 1; 6989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang while (mPendingRequest == 1) { 6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_wait(&mRequestCond, &mRequestLock); 7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_unlock(&mRequestLock); 7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 703e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 70480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 70580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 70680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 708e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : getMetadataVendorTagOps 7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 710e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 7129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 713e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 714e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 715e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 716e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(vendor_tag_query_ops_t* ops) 718e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 719e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Enable locks when we eventually add Vendor Tags */ 720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : dump 730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(int fd) 739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /*Enable lock when we implement this function*/ 741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Callback handler for all capture result (streams, as well as metadata) 753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @metadata : metadata information 756e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 7579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 7589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 7599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::captureResultCb(metadata_buffer_t *metadata, 761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 7629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 763e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mCaptureResultLock); 764e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_result_t result; 765e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 766e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (metadata) { 7689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Signal to unblock processCaptureRequest 7699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_lock(&mRequestLock); 7709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 7719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_signal(&mRequestCond); 7729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_unlock(&mRequestLock); 773e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 774e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang //TODO: Add translation from metadata_buffer_t to CameraMetadata 775e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // for now, hardcode timestamp only. 776e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata camMetadata; 777e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t *frame_number = (uint32_t *)POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata); 778e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang nsecs_t captureTime = 1000000 * (*frame_number) * 33; 779e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &captureTime, 1); 780e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 781e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.result = camMetadata.release(); 782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!result.result) { 783e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.frame_number = *frame_number; 784e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.num_output_buffers = 0; 785e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.output_buffers = NULL; 786e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 787e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 788e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang free_camera_metadata((camera_metadata_t*)result.result); 789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } else { 791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.result = NULL; 792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.frame_number = frame_number; 793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.num_output_buffers = 1; 794e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.output_buffers = buffer; 795e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 7969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 798e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mCaptureResultLock); 7999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 8009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 8019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 802625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 803625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 804625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 810625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 811625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 812625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 813625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 814625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 816625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 817625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 818625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 819625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 820625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 828e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 829e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (capabilityHeap == NULL) { 830e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: creation of capabilityHeap failed", __func__); 831e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang goto heap_creation_failed; 832e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete capabilityHeap; 873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed: 874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 881662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : initParameters 882662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 883662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters 884662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 887662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 888662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 889662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 890662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 891662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters() 892662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 893662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 894662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 895662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Allocate Set Param Buffer 896662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = new QCamera3HeapMemory(); 897662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 898662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc != OK) { 899662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = NO_MEMORY; 900662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("Failed to allocate SETPARM Heap memory"); 901662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 902662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 903662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 904662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 905662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 906662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Map memory for parameters buffer 907662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 908662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole CAM_MAPPING_BUF_TYPE_PARM_BUF, 909662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->getFd(0), 910662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(parm_buffer_t)); 911662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc < 0) { 912662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:failed to map SETPARM buffer",__func__); 913662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = FAILED_TRANSACTION; 914662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->deallocate(); 915662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 916662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 917662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 918662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 919662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 920662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0); 921662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole memset(mParameters, 0, sizeof(parm_buffer_t)); 922662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 923662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 925662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 926662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 927625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 928625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 929625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 930625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 931625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 932625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 933625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 937625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 938625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 939625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 940625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 941625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang android::CameraMetadata staticInfo; 942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK; 943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 3 only*/ 944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole #ifdef HAL_3_CAPABILITIES 945625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 946625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); 947625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 948625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 949625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 950625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 951625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 952625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths, 953625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths_count); 954625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 955625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 956625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 957625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 959625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 960625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 966625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang (int*)gCamCapability[cameraId]->optical_stab_modes, 967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 96980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 97080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 97180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 97280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 97380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 97480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 97580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 97680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 97780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 978625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 97980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map, 98080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_shading_map_size)/ sizeof(cam_dimension_t)); 981625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 98280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 98380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map_size.height}; 98480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 98580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 98680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 98780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 98880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 98980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 99080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map_size)/ sizeof(cam_dimension_t)); 99180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 99280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 99380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 99480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 99580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 99680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 99780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 99880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 99980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 100080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 100180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 100280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 100380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (int*)&gCamCapability[cameraId]->color_arrangement, 1); 100480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 100580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 100680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 100780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 100880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 100980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 101080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width, 101180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 101280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 101380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang active_array_size, 2); 101480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 101580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 101680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 1017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 101880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 101980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 102080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 102180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 102280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 102380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 102480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 102580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 102680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 102780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 102880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (int*)&gCamCapability[cameraId]->max_face_detection_count, 1); 102980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 103080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 103180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 103280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 103380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 103480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 103580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 103680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 103780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 103880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 103980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 104080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 104180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 104280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 104380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 104480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 104580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 104680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 104780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 104880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 104980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1050662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t scalar_formats[CAM_FORMAT_MAX]; 1051662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scalar_format_cnt; i++) { 1052662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats[i] = getScalarFormat(gCamCapability[cameraId]->supported_scalar_fmts[i]); 1053662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1054662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 1055662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats, 1056662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(scalar_formats)/sizeof(int32_t)); 1057662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1058662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t available_processed_sizes[CAM_FORMAT_MAX]; 1059662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole makeTable(gCamCapability[cameraId]->supported_sizes_tbl, 1060662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->supported_sizes_tbl_cnt, 1061662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes); 1062662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 1063662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes, 1064662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(available_processed_sizes)/sizeof(int32_t)); 1065662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole #else 1066662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const float minFocusDistance = 0; 1067662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 1068662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &minFocusDistance, 1); 1069662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1070662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const float hyperFocusDistance = 0; 1071662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 1072662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &hyperFocusDistance, 1); 1073662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1074662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float focalLength = 3.30f; 1075662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 1076662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &focalLength, 1077662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1); 1078662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1079662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float aperture = 2.8f; 1080662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 1081662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &aperture, 1082662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1); 1083662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1084662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float filterDensity = 0; 1085662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 1086662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &filterDensity, 1); 1087662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1088662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableOpticalStabilization = 1089662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 1090662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 1091662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &availableOpticalStabilization, 1); 1092662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1093662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole float lensPosition[3]; 1094662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (facingBack) { 1095662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole // Back-facing camera is center-top on device 1096662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[0] = 0; 1097662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[1] = 20; 1098662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[2] = -5; 1099662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 1100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole // Front-facing camera is center-right on device 1101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[0] = 20; 1102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[1] = 20; 1103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[2] = 0; 1104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_POSITION, 1106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition, 1107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(lensPosition)/ sizeof(float)); 1108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t lensShadingMapSize[] = {1, 1}; 1110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 1111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensShadingMapSize, 1112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(lensShadingMapSize)/sizeof(int32_t)); 1113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float lensShadingMap[3 * 1 * 1 ] = 1115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { 1.f, 1.f, 1.f }; 1116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, 1117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensShadingMap, 1118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(lensShadingMap)/ sizeof(float)); 1119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1120662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t geometricCorrectionMapSize[] = {2, 2}; 1121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 1122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole geometricCorrectionMapSize, 1123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(geometricCorrectionMapSize)/sizeof(int32_t)); 1124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float geometricCorrectionMap[2 * 3 * 2 * 2] = { 1126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 1127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 1129662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; 1130662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 1131662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole geometricCorrectionMap, 1132662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(geometricCorrectionMap)/ sizeof(float)); 1133662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1134662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; 1135662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 1136662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sensorPhysicalSize, 2); 1137662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1138662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const int64_t exposureTimeRange[2] = {1000L, 30000000000L} ; // 1 us - 30 sec 1139662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 1140662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole exposureTimeRange, 2); 1141662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1142662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const int64_t frameDurationRange[2] = {33331760L, 30000000000L}; 1143662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 1144662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole frameDurationRange, 1); 1145662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1146662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const uint8_t colorFilterArrangement = 1147662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB; 1148662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 1149662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &colorFilterArrangement, 1); 1150662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1151662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const int resolution[2] = {640, 480}; 1152662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 1153662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole resolution, 2); 1154662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1155662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 1156662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole resolution, 2); 1157662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1158662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const uint32_t whiteLevel = 4000; 1159662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 1160662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (int32_t*)&whiteLevel, 1); 1161662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1162662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t blackLevelPattern[4] = { 1163662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1000, 1000, 1164662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1000, 1000 }; 1165662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 1166662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole blackLevelPattern, 4); 1167662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1168662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int64_t flashChargeDuration = 0; 1169662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 1170662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &flashChargeDuration, 1); 1171662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1172662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t tonemapCurvePoints = 128; 1173662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 1174662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &tonemapCurvePoints, 1); 1175662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1176662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t maxFaceCount = 8; 1177662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 1178662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &maxFaceCount, 1); 1179662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1180662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t histogramSize = 64; 1181662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 1182662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &histogramSize, 1); 1183662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1184662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t maxHistogramCount = 1000; 1185662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 1186662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &maxHistogramCount, 1); 1187662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1188662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t sharpnessMapSize[2] = {64, 64}; 1189662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 1190662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t)); 1191662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1192662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t maxSharpnessMapValue = 1000; 1193662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 1194662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &maxSharpnessMapValue, 1); 1195662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1196662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF}; 1197662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 1198662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableVstabModes, sizeof(availableVstabModes)); 1199662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1200662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const uint64_t availableRawMinDurations[1] = {33331760L}; 1201662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 1202662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (int64_t*)&availableRawMinDurations, 1203662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1); 1204662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1205662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const uint32_t availableFormats[4] = { 1206662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole HAL_PIXEL_FORMAT_RAW_SENSOR, 1207662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole HAL_PIXEL_FORMAT_BLOB, 1208662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole HAL_PIXEL_FORMAT_RGBA_8888, 1209662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole HAL_PIXEL_FORMAT_YCrCb_420_SP 1210662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole }; 1211662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 1212662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (int32_t*)availableFormats, 1213662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 4); 1214662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1215662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const uint32_t availableProcessedSizes[4] = {640, 480, 320, 240}; 1216662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 1217662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (int32_t*)availableProcessedSizes, 1218662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(availableProcessedSizes)/sizeof(int32_t)); 1219662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1220662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 1221662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole resolution, 1222662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(resolution)/sizeof(int)); 1223662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1224662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableFaceDetectModes[] = { 1225662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_STATISTICS_FACE_DETECT_MODE_OFF }; 1226662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1227662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 1228662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableFaceDetectModes, 1229662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(availableFaceDetectModes)); 1230662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1231662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableSceneModes[] = { 1232662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED }; 1233662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1234662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 1235662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableSceneModes, sizeof(availableSceneModes)); 1236662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1237662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t availableFpsRanges[] = {15, 30}; 1238662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 1239662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableFpsRanges, sizeof(availableFpsRanges)/sizeof(int32_t)); 1240662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1241662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableEffectsModes[] = { 1242662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_CONTROL_EFFECT_MODE_OFF }; 1243662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 1244662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableEffectsModes, sizeof(availableEffectsModes)); 1245662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1246662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableAntibandingModes[] = { 1247662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF }; 1248662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 1249662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableAntibandingModes, sizeof(availableAntibandingModes)); 1250662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1251662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t flashAvailable = 0; 1252662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE, 1253662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &flashAvailable, sizeof(flashAvailable)); 1254662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1255662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t max3aRegions = 0; 1256662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_MAX_REGIONS, 1257662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &max3aRegions, 1); 1258662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1259662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const camera_metadata_rational exposureCompensationStep = { 1260662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1, 3 1261662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole }; 1262662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1263662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &exposureCompensationStep, 1); 1264662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1265662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t jpegThumbnailSizes[] = { 1266662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 0, 0, 1267662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 160, 120, 1268662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 320, 240 1269662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole }; 1270662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 1271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t)); 1272662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1273662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t maxZoom = 10; 1274662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 1275662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &maxZoom, 1); 1276662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1277662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int64_t jpegMinDuration[] = {33331760L, 30000000000L}; 1278662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 1279662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpegMinDuration, 1280662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(jpegMinDuration)/sizeof(uint64_t)); 1281662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole #endif 1282662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 1 and HAL 3 common*/ 1283662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width, 1284662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->raw_dim.height}; 1285662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 1286662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole raw_size, 1287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(raw_size)/sizeof(uint32_t)); 1288662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 128980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 129080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 129180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 129280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 129380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 129480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1295662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint8_t lensFacing = (facingBack) ? 129680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 129780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 1298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1299662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t available_jpeg_sizes[MAX_SIZES_CNT]; 1300662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole makeTable(gCamCapability[cameraId]->picture_sizes_tbl, 1301662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->picture_sizes_tbl_cnt, 1302662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_jpeg_sizes); 1303662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 1304662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_jpeg_sizes, 1305662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(available_jpeg_sizes)/sizeof(int32_t)); 1306662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1307662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t avail_effects[CAM_EFFECT_MODE_MAX]; 1308662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) { 1309662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_effects[i] = lookupFwkName(EFFECT_MODES_MAP, 1310662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(EFFECT_MODES_MAP)/sizeof(int), 1311662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->supported_effects[i]); 1312662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1313662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 1314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_effects, 1315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(avail_effects)/sizeof(int32_t)); 1316662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t avail_scene_modes[CAM_SCENE_MODE_MAX]; 1318662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) { 1319662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_scene_modes[i] = lookupFwkName(SCENE_MODES_MAP, 1320662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(SCENE_MODES_MAP)/sizeof(int), 1321662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->supported_scene_modes[i]); 1322662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1323662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 1324662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_scene_modes, 1325662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(avail_scene_modes)/sizeof(int32_t)); 1326662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1327662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX]; 1328662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) { 1329662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_antibanding_modes[i] = lookupFwkName(ANTIBANDING_MODES_MAP, 1330662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(ANTIBANDING_MODES_MAP)/sizeof(int), 1331662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->supported_antibandings[i]); 1332662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1333662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 1334662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_antibanding_modes, 1335662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(avail_antibanding_modes)/sizeof(int32_t)); 1336662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1337662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX]; 1338662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) { 1339662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_af_modes[i] = lookupFwkName(FOCUS_MODES_MAP, 1340662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(FOCUS_MODES_MAP)/sizeof(int), 1341662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->supported_focus_modes[i]); 1342662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1343662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 1344662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_af_modes, 1345662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(avail_af_modes)); 1346662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1347662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t avail_awb_modes[CAM_WB_MODE_MAX]; 1348662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) { 1349662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_awb_modes[i] = lookupFwkName(WHITE_BALANCE_MODES_MAP, 1350662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(int), 1351662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->supported_white_balances[i]); 1352662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1353662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 1354662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_awb_modes, 1355662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(avail_awb_modes)/sizeof(int32_t)); 1356662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1357662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t avail_flash_modes[CAM_FLASH_MODE_MAX]; 1358662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) { 1359662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_flash_modes[i] = lookupFwkName(FLASH_MODES_MAP, 1360662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(FLASH_MODES_MAP)/sizeof(int), 1361662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->supported_flash_modes[i]); 1362662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1363662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_FLASH_MODE, 1364662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_flash_modes, 1365662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(avail_flash_modes)/sizeof(int32_t)); 1366662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1367662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*so far fwk seems to support only 2 aec modes on and off*/ 1368662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t avail_ae_modes[] = { 1369662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_CONTROL_AE_MODE_OFF, 1370662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_CONTROL_AE_MODE_ON 1371662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole }; 1372662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 1373662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_ae_modes, 1374662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(avail_ae_modes)); 1375662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gStaticMetadata = staticInfo.release(); 1377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1381662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : makeTable 1382662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1383662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes 1384662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1385662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1386662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1387662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1388662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1389662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1390662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 1391662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1392662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1393662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size, 1394662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t* sizeTable) 1395662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1396662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int j = 0; 1397662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < size; i++) { 1398662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j] = dimTable[i].width; 1399662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j+1] = dimTable[i].height; 1400662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole j+=2; 1401662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1402662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1403662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 1404662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : getPreviewHalPixelFormat 1405662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1406662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework 1407662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1408662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend 1409662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1410662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN : format recognized by framework 1411662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1412662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1413662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format) 1414662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1415662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t halPixelFormat; 1416662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1417662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole switch (format) { 1418662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV12: 1419662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; 1420662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 1421662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21: 1422662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 1423662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 1424662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21_ADRENO: 1425662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO; 1426662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 1427662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_YV12: 1428662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YV12; 1429662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 1430662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV16: 1431662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV61: 1432662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole default: 1433662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 1434662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 1435662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1436662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return halPixelFormat; 1437662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1438662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1439662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 1440662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : AddSetParmEntryToBatch 1441662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1442662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch 1443662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1444662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1445662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @p_table : ptr to parameter buffer 1446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramType : parameter type 1447662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramLength : length of parameter value 1448662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramValue : ptr to parameter value 1449662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1450662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1451662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 1452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table, 1455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole cam_intf_parm_type_t paramType, 1456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint32_t paramLength, 1457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole void *paramValue) 1458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int position = paramType; 1460662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int current, next; 1461662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 1463662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Code to take care of linking next flags * 1464662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 1465662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_FIRST_PARAM_ID(p_table); 1466662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position == current){ 1467662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //DO NOTHING 1468662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else if (position < current){ 1469662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, current); 1470662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_FIRST_PARAM_ID(p_table, position); 1471662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 1472662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /* Search for the position in the linked list where we need to slot in*/ 1473662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole while (position > GET_NEXT_PARAM_ID(current, p_table)) 1474662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_NEXT_PARAM_ID(current, p_table); 1475662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1476662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*If node already exists no need to alter linking*/ 1477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position != GET_NEXT_PARAM_ID(current, p_table)) { 1478662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole next = GET_NEXT_PARAM_ID(current, p_table); 1479662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(current, p_table, position); 1480662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, next); 1481662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1482662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1483662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1484662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 1485662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Copy contents into entry * 1486662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 1487662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1488662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (paramLength > sizeof(parm_type_t)) { 1489662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:Size of input larger than max entry size",__func__); 1490662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 1491662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1492662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength); 1493662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NO_ERROR; 1494662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1495662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1496662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 1497662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupFwkName 1498662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1499662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 1500662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 1501662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1502662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1503662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 1504662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 1505662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @hal_name : name of the hal_parm to map 1506662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1507662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int type of status 1508662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * fwk_name -- success 1509662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1510662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1511662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[], 1512662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int hal_name) 1513662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1514662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1515662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 1516662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].hal_name == hal_name) 1517662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].fwk_name; 1518662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1519662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NAME_NOT_FOUND; 1520662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1521662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1522662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 1523662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupHalName 1524662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 1526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 1527662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1528662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1529662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 1530662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 1531662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @fwk_name : name of the hal_parm to map 1532662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1533662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1534662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * hal_name -- success 1535662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1536662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1537662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[], 1538662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int fwk_name) 1539662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1540662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 1541662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].fwk_name == fwk_name) 1542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].hal_name; 1543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1544662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NAME_NOT_FOUND; 1545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1547662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 1548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 1549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1550625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 1551625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 1555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 1558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 1559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 1561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 1562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 1564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 1566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 1567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 1568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 1569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gStaticMetadata) { 1574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 1575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 1576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 1581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 1582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 1583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 1586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 1587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 1590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 1591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 1592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1593625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 1597e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0); 1598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->static_camera_characteristics = gStaticMetadata; 1599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1602625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 1605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 1607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1608625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 1609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1610625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1611625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 1612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 1613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateToMetadata(int type) 1616625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1617e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1618e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 1620e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 1622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 1624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 1625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang android::CameraMetadata settings; 1626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 1627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 1628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 1629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 1631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 1633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 1634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 1635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 1636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 1638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 1639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 1641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 1642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 1644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 1645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 1647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 1648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 1650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 1651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 1654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 16559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 16569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 1657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 1659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 1660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 1662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 1663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 1665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 1666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 1668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 1669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 1671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 1672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 1674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 1675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 1677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 1678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 1679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 1682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_aperture = gCamCapability[mCameraId]->apertures[0]; 1683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 1684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 1686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 1); 1687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0]; 1689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 1690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 1692e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1693e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 1695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 169880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 169980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 170080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 170180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 170280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 170380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 170480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 170580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 170680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 170780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 170880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 170980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 1710662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id, 1711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const camera_metadata_t *settings) 171280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 171380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 171480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 1715662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (settings == NULL && mParameters == NULL) { 171680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 171780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 1718662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1719662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*we need to update the frame number in the parameters*/ 1720662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 1721662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(frame_id), &frame_id); 1722662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (rc < 0) { 1723662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s: Failed to set the frame number in the parameters", __func__); 1724662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 1725662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1726662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(settings != NULL){ 172780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang rc = translateMetadataToParameters(settings); 172880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 172980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 1730662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 173180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 173280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 173380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 173480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 173580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 173680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 173780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 173880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 173980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 174080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 174180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 174280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 174380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 174480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 174580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 174680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 174780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 174880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (const camera_metadata_t *settings) 174980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 1750662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 1751662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole android::CameraMetadata frame_settings; 1752662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole frame_settings = settings; 1753662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1754662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //white balance 1755662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t fwk_whiteLevel = frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.i32[0]; 1756662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP, 1757662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(WHITE_BALANCE_MODES_MAP)/ sizeof(int32_t), 1758662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole fwk_whiteLevel); 1759662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE, 1760662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(whiteLevel), &whiteLevel); 1761662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //effect 1762662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t fwk_effectMode = frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.i32[0]; 1763662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int effectMode = lookupHalName(EFFECT_MODES_MAP, 1764662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(EFFECT_MODES_MAP)/ sizeof(int32_t), 1765662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole fwk_effectMode); 1766662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT, 1767662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(effectMode), &effectMode); 1768662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //ae mode 1769662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t fwk_aeMode = frame_settings.find(ANDROID_CONTROL_AE_MODE).data.i32[0]; 1770662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int aeMode = lookupHalName(AUTO_EXPOSURE_MAP, 1771662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(AUTO_EXPOSURE_MAP)/ sizeof(int32_t), 1772662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole fwk_aeMode); 1773662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE, 1774662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(aeMode), &aeMode); 1775662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1776662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //scaler crop region 1777662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t scalerCropRegion = frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0]; 1778662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SCALER_CROP_REGION, 1779662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(scalerCropRegion), &scalerCropRegion); 1780662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1781662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //capture_intent 1782662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t captureIntent = frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.i32[0]; 1783662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 1784662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(captureIntent), &captureIntent); 1785662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1786662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1787662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1788662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1789662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 1790662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : translateMetadataToParameters 1791662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1792662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 1793662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1794662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1795662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1796662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @settings : frame settings information from framework 1797662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1798662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1799662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : success: NO_ERROR 1800662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * failure: 1801662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1802662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings 1803662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (const camera_metadata_t *settings) 1804662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1805662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (mJpegSettings) { 1806662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole free(mJpegSettings); 1807662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = NULL; 1808662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1809662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t)); 1810662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole android::CameraMetadata jpeg_settings; 1811662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings = settings; 1812662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1813662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings->jpeg_orientation = 1814662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0]; 1815662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings->jpeg_quality = 1816662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0]; 1817662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings->thumbnail_size.height = 1818662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0]; 1819662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings->thumbnail_size.height = 1820662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1]; 1821662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < 3; i++) { 1822662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings->gps_coordinates[i] = 1823662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.d[i]; 1824662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1825662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings->gps_timestamp = 1826662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0]; 1827662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings->gps_processing_method = 1828662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[0]; 1829662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings->sensor_sensitivity = 1830662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 1831662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings->lens_focal_length = 1832662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 183380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 183480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 183580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 183680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 1837e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 1838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 1840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 1843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 1844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 1845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 1847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1848e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::captureResultCb(metadata_buffer_t *metadata, 1849e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, 1850e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frame_number, void *userdata) 1851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 1853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 1854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 1855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 1856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1858e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->captureResultCb(metadata, buffer, frame_number); 1859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 1860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 1864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 1866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 1871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 1872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 1875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 1876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 1882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->initialize(callback_ops); 1885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 1889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1893625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 1896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 1897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 1898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 1901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 1902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 1903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 1909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->configureStreams(stream_list); 1911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 1915625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1916625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 1917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1918625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1919625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1920625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1922625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 1923625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 1924625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 1925625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1926625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1927625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1928625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1929625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1930625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 1931625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1932625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->registerStreamBuffers(buffer_set); 1933625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 1937625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1938625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 1939625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1940625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1941625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1942625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1943625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 1944625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 1945625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 19469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 19479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 19489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 1949625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1950625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1951625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 1952625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1953625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1954625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1955625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1956625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 1957625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1959662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole fwk_metadata = hw->translateToMetadata(type); 1960625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 1962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 1966625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1971625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 19749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 19759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 19769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 1977625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 197880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 197980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 198080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 198180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 19829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 198380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 19849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 19859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return hw->processCaptureRequest(request); 1986625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1987625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1988625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 1990625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1991625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1993625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1997625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1998625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1999e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops( 2000e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, 2001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang vendor_tag_query_ops_t* ops) 2002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2003e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 2004e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2005e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 2006e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2007e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2008e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 2009e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2010e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->getMetadataVendorTagOps(ops); 2011e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 2016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 2018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2020625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2021625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2022625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 2023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2025e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump( 2026e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, int fd) 2027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2028e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 2029e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2030e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 2031e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2032e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2033e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 2034e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2035e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->dump(fd); 2036e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2039e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 2040e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : close_camera_device 2041e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2042e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 2043e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2044e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 2045e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2046e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2047e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 2048e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 2049e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 2050e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 2051e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int ret = NO_ERROR; 2052e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 2053e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>( 2054e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<camera3_device_t *>(device)->priv); 2055e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 2056e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("NULL camera device"); 2057e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return BAD_VALUE; 2058e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 2059e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete hw; 2060e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return ret; 2061e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 2062e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2063e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 2065