QCamera3HWI.cpp revision e9a0b4995192d264f75543f62efa089845456291
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" 4366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h" 44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android; 46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 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; 51b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS]; 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[] = { 660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_OFF, CAM_WB_MODE_OFF }, 67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_AUTO, CAM_WB_MODE_AUTO }, 68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_INCANDESCENT, CAM_WB_MODE_INCANDESCENT }, 69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_FLUORESCENT, CAM_WB_MODE_FLUORESCENT }, 70662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT}, 71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_DAYLIGHT, CAM_WB_MODE_DAYLIGHT }, 72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT }, 73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_TWILIGHT, CAM_WB_MODE_TWILIGHT }, 74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_SHADE, CAM_WB_MODE_SHADE } 75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = { 78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED, CAM_SCENE_MODE_OFF }, 79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_ACTION, CAM_SCENE_MODE_ACTION }, 80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PORTRAIT, CAM_SCENE_MODE_PORTRAIT }, 81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE, CAM_SCENE_MODE_LANDSCAPE }, 82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT, CAM_SCENE_MODE_NIGHT }, 83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT }, 84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_THEATRE, CAM_SCENE_MODE_THEATRE }, 85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BEACH, CAM_SCENE_MODE_BEACH }, 86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SNOW, CAM_SCENE_MODE_SNOW }, 87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SUNSET, CAM_SCENE_MODE_SUNSET }, 88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO, CAM_SCENE_MODE_ANTISHAKE }, 89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_FIREWORKS , CAM_SCENE_MODE_FIREWORKS }, 90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SPORTS , CAM_SCENE_MODE_SPORTS }, 91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PARTY, CAM_SCENE_MODE_PARTY }, 92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT, CAM_SCENE_MODE_CANDLELIGHT }, 9397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BARCODE, CAM_SCENE_MODE_BARCODE} 94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = { 97b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang { ANDROID_CONTROL_AF_MODE_OFF, CAM_FOCUS_MODE_FIXED }, 98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_AUTO, CAM_FOCUS_MODE_AUTO }, 99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_MACRO, CAM_FOCUS_MODE_MACRO }, 100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_EDOF, CAM_FOCUS_MODE_EDOF }, 101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE }, 102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO, CAM_FOCUS_MODE_CONTINOUS_VIDEO } 103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = { 106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, CAM_ANTIBANDING_MODE_OFF }, 107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ }, 108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ }, 109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO } 110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 112e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = { 113e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_OFF, CAM_FLASH_MODE_OFF }, 114e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON, CAM_FLASH_MODE_OFF }, 115e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH, CAM_FLASH_MODE_AUTO}, 116e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH, CAM_FLASH_MODE_ON }, 117e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO} 118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 120662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = { 121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_OFF, CAM_FLASH_MODE_OFF }, 122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_ON }, 123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH} 124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = { 128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang initialize: QCamera3HardwareInterface::initialize, 129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang configure_streams: QCamera3HardwareInterface::configure_streams, 130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang register_stream_buffers: QCamera3HardwareInterface::register_stream_buffers, 131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings, 132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang process_capture_request: QCamera3HardwareInterface::process_capture_request, 133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang get_metadata_vendor_tag_ops: QCamera3HardwareInterface::get_metadata_vendor_tag_ops, 134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang dump: QCamera3HardwareInterface::dump, 135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; 136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3HardwareInterface 140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera ID 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId) 149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang : mCameraId(cameraId), 150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle(NULL), 151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened(false), 15297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mCallbackOps(NULL), 15333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mInputStream(NULL), 15433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mMetadataChannel(NULL), 15533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest(false), 15633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap(NULL), 15733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters(NULL), 15897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mJpegSettings(NULL) 159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 161e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0; 162e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.close = close_camera_device; 163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.ops = &mCameraOps; 164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.priv = this; 165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->version = CAM_HAL_V3; 1669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_init(&mRequestLock, NULL); 1689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_init(&mRequestCond, NULL); 1699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 171e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_init(&mMutex, NULL); 17233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang pthread_mutex_init(&mCaptureResultLock, NULL); 17333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 17433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 17533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mDefaultMetadata[i] = NULL; 176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 18166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface 182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 189d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 1901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Clean up all channels */ 1911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->stop(); 1921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete mMetadataChannel; 1931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel = NULL; 194d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* We need to stop all streams before deleting any stream */ 1951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 1961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 1971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 1981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole channel->stop(); 199d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang } 200d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 201d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang it != mStreamInfo.end(); it++) { 202d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 2031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 2041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free (*it); 2051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 2061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 20797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (mJpegSettings != NULL) { 20897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole free(mJpegSettings); 20997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mJpegSettings = NULL; 21097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 21133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang deinitParameters(); 212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang closeCamera(); 213e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 21433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 21533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (mDefaultMetadata[i]) 21633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang free_camera_metadata(mDefaultMetadata[i]); 21733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 218e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mRequestLock); 219e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_cond_destroy(&mRequestCond); 220e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 221e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mMutex); 22233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang pthread_mutex_destroy(&mCaptureResultLock); 223d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //int rc = NO_ERROR; 241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc == 0) 249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang else 251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 321e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 322e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 32333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang rc = initParameters(); 32433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (rc < 0) { 32533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang ALOGE("%s: initParamters failed %d", __func__, rc); 32633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang goto err1; 32733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } 3289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Create metadata channel and initialize it 329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 330e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraHandle->ops, captureResultCb, 331e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this); 332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mMetadataChannel == NULL) { 333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to allocate metadata channel", __func__); 3349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = -ENOMEM; 33533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang goto err2; 3369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 3379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = mMetadataChannel->initialize(); 3389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 3399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: metadata channel initialization failed", __func__); 3409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err3; 3419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 3429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 3439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCallbackOps = callback_ops; 344e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 345e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 3469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 3479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 3489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr3: 3499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mMetadataChannel; 3509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMetadataChannel = NULL; 35133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangerr2: 35233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang deinitParameters(); 3539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1: 354e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 3559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 37333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int rc = 0; 3740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_lock(&mMutex); 375e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 379e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 385e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 392e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *inputStream = NULL; 3970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /* first invalidate all the steams in the mStreamList 3980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * if they appear again, they will be validated */ 3991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 401d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 402d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang channel->stop(); 4030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = INVALID; 4040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 405d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 4081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGV("%s: newStream type = %d, stream format = %d", 4091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole __func__, newStream->stream_type, newStream->format); 4100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //if the stream is in the mStreamList validate it 4110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole bool stream_exists = false; 4121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 4140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if ((*it)->stream == newStream) { 4151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = 4161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (QCamera3Channel*)(*it)->stream->priv; 4170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_exists = true; 4180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = RECONFIGURE; 4191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*delete the channel object associated with the stream because 4201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole we need to reconfigure*/ 4211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 4221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->stream->priv = NULL; 4230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (!stream_exists) { 4260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //new stream 4270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info_t* stream_info; 4280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info = (stream_info_t* )malloc(sizeof(stream_info_t)); 4290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->stream = newStream; 4300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->status = VALID; 4311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole stream_info->registered = 0; 4320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mStreamInfo.push_back(stream_info); 4330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT) { 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 437e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /*clean up invalid streams*/ 4461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end();) { 4480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if(((*it)->status) == INVALID){ 4491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 4501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 4510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole delete[] (buffer_handle_t*)(*it)->buffer_set.buffers; 4520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole free(*it); 4531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it = mStreamInfo.erase(it); 4541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 4551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it++; 4560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 45933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang //mMetadataChannel->stop(); 460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 467f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_INPUT: 468f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 469f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 470f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_BIDIRECTIONAL: 471f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 472f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab GRALLOC_USAGE_HW_CAMERA_WRITE; 473f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 474f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_OUTPUT: 475f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 476f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 477f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 478f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 479f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 4831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 486f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 4878867984d33ed870071109a4500402dddbc85c048Shuzhen Wang case HAL_PIXEL_FORMAT_YCbCr_420_888: 488f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 489f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 490f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 491f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 492f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 493f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 494f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 495f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 496f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 497f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 498f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 499f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 500f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_BLOB: 501f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 502f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab channel = new QCamera3PicChannel(mCameraHandle->camera_handle, 503f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 504f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 505f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 506f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 507f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 508f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 509f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 510f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 511f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 512f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 513f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab //TODO: Add support for app consumed format? 514f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 515f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 516f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 5248867984d33ed870071109a4500402dddbc85c048Shuzhen Wang /*For the streams to be reconfigured we need to register the buffers 5251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole since the framework wont*/ 5261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 5271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 5281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->status == RECONFIGURE) { 5291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 5301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*only register buffers for streams that have already been 5311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole registered*/ 5321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->registered) { 5331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = channel->registerBuffers((*it)->buffer_set.num_buffers, 5341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers); 5351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (rc != NO_ERROR) { 5361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Failed to register the buffers of old stream,\ 5371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = %d", __func__, rc); 5381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 539d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: channel %p has %d buffers", 540e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, channel, (*it)->buffer_set.num_buffers); 5410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 5441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream); 5451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (index == NAME_NOT_FOUND) { 5461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.add((*it)->stream, 0); 5471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 5481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueAt(index) = 0; 5491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 5500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 5521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Initialize mPendingRequestInfo and mPendnigBuffersMap */ 5531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.clear(); 5541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 55533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang //settings/parameters don't carry over for new configureStreams 5569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 55733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest = true; 55833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 559e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 56033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return rc; 561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 564e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : validateCaptureRequest 565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 566e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service 56780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 56880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 56980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 57080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 57180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 57280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 57380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 574e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest( 5759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 57680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 5779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 5789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 5799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 5809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 5829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 5839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 5849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 5889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 5899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 5909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 5919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 5929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 5959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 5969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 5979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 6009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //TODO 6019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Not supporting input buffer yet", __func__); 6029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 6069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 6079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 6089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 6099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 6109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 6119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 6129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 6139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 6169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 6179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 6189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 6219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 6229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 6239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 6269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 6279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 6289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 6319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 6329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 6339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 634e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 635e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 636e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 637e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 638e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : registerStreamBuffers 639e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 640e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 641e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 642e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 643e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @stream_list : streams to be configured 644e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 645e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 646e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 647e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 648e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 649e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 650e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 651e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = 0; 652e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 653e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 654e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 655e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set == NULL) { 656e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 657e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 658e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 659e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 660e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->stream == NULL) { 661e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 662e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 663e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 664e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 665e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->num_buffers < 1) { 666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 669e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 670e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->buffers == NULL) { 671e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 673e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 674e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 675e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 676e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 677e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 6790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //set the buffer_set in the mStreamInfo array 6801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 6811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 6821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->stream == stream) { 6830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint32_t numBuffers = buffer_set->num_buffers; 6841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.stream = buffer_set->stream; 6851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.num_buffers = numBuffers; 6861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers]; 6871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->buffer_set.buffers == NULL) { 6880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Failed to allocate buffer_handle_t*", __func__); 6890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_unlock(&mMutex); 6900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole return -ENOMEM; 6910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (size_t j = 0; j < numBuffers; j++){ 6931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers[j] = buffer_set->buffers[j]; 6940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->registered = 1; 6960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 699e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (stream->stream_type != CAMERA3_STREAM_OUTPUT) { 700e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: not yet support non output type stream", __func__); 701e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 702e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 703e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 704e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 705e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 706e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 707e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 708e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENODEV; 709e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 710e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 711e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 712e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 713e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 714e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 715e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 716e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : processCaptureRequest 717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 718e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service 719e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @request : request from framework to process 722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_request_t *request) 728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = NO_ERROR; 730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata meta; 731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = validateCaptureRequest(request); 735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != NO_ERROR) { 736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: incoming request is not valid", __func__); 737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frameNumber = request->frame_number; 742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 743662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = setFrameParameters(request->frame_number, request->settings); 7449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 7459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: fail to set frame parameters", __func__); 746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 7479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 7489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 750e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ALOGV("%s: %d, num_output_buffers = %d", __func__, __LINE__, 751e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang request->num_output_buffers); 752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // Acquire all request buffers first 753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang sp<Fence> acquireFence = new Fence(output.acquire_fence); 75666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 75766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 75866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Call function to store local copy of jpeg data for encode params. 75966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = getJpegSettings(request->settings); 76066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (rc < 0) { 7610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: failed to get jpeg parameters", __func__); 76266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pthread_mutex_unlock(&mMutex); 76366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 76466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 76566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 76666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 768e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != OK) { 769e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: fence wait failed %d", __func__, rc); 770e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 771e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 772e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 773e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 774e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 7751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Update pending request list and pending buffers map */ 7761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_mutex_lock(&mRequestLock); 7771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole PendingRequestInfo pendingRequest; 7781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.frame_number = frameNumber; 7791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.num_buffers = request->num_output_buffers; 7801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < request->num_output_buffers; i++) { 7811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole RequestedBufferInfo requestedBuf; 7821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.stream = request->output_buffers[i].stream; 7831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.buffer = NULL; 7841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.buffers.push_back(requestedBuf); 7851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 7861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(requestedBuf.stream)++; 7871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 7881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.push_back(pendingRequest); 7891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_mutex_unlock(&mRequestLock); 7901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 7919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMetadataChannel->request(NULL, frameNumber); 7939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 7959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 7969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 7979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 79866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 7999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 8009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 8019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 8029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 80466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 80566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = channel->request(output.buffer, frameNumber, mJpegSettings); 80666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 807d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGI("%s: %d, request with buffer %p, frame_number %d", __func__, __LINE__, output.buffer, frameNumber); 80866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = channel->request(output.buffer, frameNumber); 80966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 8109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 8119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 8129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 8141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mFirstRequest = false; 8151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 8169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 8179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_lock(&mRequestLock); 8189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 1; 8199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang while (mPendingRequest == 1) { 8209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_wait(&mRequestCond, &mRequestLock); 8219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_unlock(&mRequestLock); 8239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 824e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 82580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 82680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 82780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 8289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 829e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : getMetadataVendorTagOps 8309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 831e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 8329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 8339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 834e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 835e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 836e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 837e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 838b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps( 839b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang vendor_tag_query_ops_t* /*ops*/) 840e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 841e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Enable locks when we eventually add Vendor Tags */ 842e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 843e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 844e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 845e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 846e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 847e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 848e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 849e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 850e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : dump 852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 853e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 854e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 855e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 856e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 857e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 858e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 859e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 860b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/) 861e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 862e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /*Enable lock when we implement this function*/ 863e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 864e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 865e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 866e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 867e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 868e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 869e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 870e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 87433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result 87533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * (streams, as well as metadata) 876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 877e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 878e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @metadata : metadata information 87933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. 88033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * NULL if metadata. 8819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 8829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 8839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 8841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf, 885e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 8869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 8871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_mutex_lock(&mRequestLock); 888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 8891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (metadata_buf) { 8901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer; 89133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int32_t frame_number_valid = *(int32_t *) 89233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata); 89333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang uint32_t frame_number = *(uint32_t *) 89433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata); 8950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole const struct timeval *tv = (const struct timeval *) 8960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata); 8970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC + 8980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole tv->tv_usec * NSEC_PER_USEC; 8990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 9001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!frame_number_valid) { 901d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Not a valid frame number, used as SOF only", __func__); 9021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->bufDone(metadata_buf); 9031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole goto done_metadata; 9041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 905d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: valid frame_number = %d, capture_time = %lld", __func__, 906e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang frame_number, capture_time); 9071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Go through the pending requests info and send shutter/results to frameworks 9091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 910e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i != mPendingRequestsList.end() && i->frame_number <= frame_number;) { 9111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 9121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_notify_msg_t notify_msg; 913d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: frame_number in the list is %d", __func__, i->frame_number); 9141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Flush out all entries with less or equal frame numbers. 9161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 917e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: Make sure shutter timestamp really reflects shutter timestamp. 918e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //Right now it's the same as metadata timestamp 919e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 920e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: When there is metadata drop, how do we derive the timestamp of 921e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //dropped frames? For now, we fake the dropped timestamp by substracting 922e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //from the reported timestamp 923e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang nsecs_t current_capture_time = capture_time - 924e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang (frame_number - i->frame_number) * NSEC_PER_33MSEC; 925e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 9261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send shutter notify to frameworks 9271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.type = CAMERA3_MSG_SHUTTER; 9281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.message.shutter.frame_number = i->frame_number; 929e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang notify_msg.message.shutter.timestamp = current_capture_time; 9301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->notify(mCallbackOps, ¬ify_msg); 931d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: notify frame_number = %d, capture_time = %lld", __func__, 932e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i->frame_number, capture_time); 9331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send empty metadata with already filled buffers for dropped metadata 9351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // and send valid metadata with already filled buffers for current metadata 9361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i->frame_number < frame_number) { 937e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang CameraMetadata emptyMetadata(1, 0); 938e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang emptyMetadata.update(ANDROID_SENSOR_TIMESTAMP, 939e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ¤t_capture_time, 1); 940e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.result = emptyMetadata.release(); 9411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 942e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.result = translateCbMetadataToResultMetadata(metadata, 943e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang current_capture_time); 9441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Return metadata buffer 9451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->bufDone(metadata_buf); 9461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result.result) { 9481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: metadata is NULL", __func__); 9491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.frame_number = i->frame_number; 9511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 0; 952e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.output_buffers = NULL; 9531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 954e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 9551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 9561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers++; 9571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (result.num_output_buffers > 0) { 9611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_stream_buffer_t *result_buffers = 9621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole new camera3_stream_buffer_t[result.num_output_buffers]; 9631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result_buffers) { 9641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Fatal error: out of memory", __func__); 9651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole size_t result_buffers_idx = 0; 9671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 968e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 9691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 9701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result_buffers[result_buffers_idx++] = *(j->buffer); 9711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free(j->buffer); 9721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(j->stream)--; 9731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = result_buffers; 9761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 978d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: meta frame_number = %d, capture_time = %lld", 979d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 9801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 9811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete[] result_buffers; 9821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 9831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 984d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: meta frame_number = %d, capture_time = %lld", 985d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 9861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 9871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // erase the element from the list 9891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i = mPendingRequestsList.erase(i); 9901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 99133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 99233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 9931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata: 9941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole bool max_buffers_dequeued = false; 9951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < mPendingBuffersMap.size(); i++) { 9961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i); 997e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang uint32_t queued_buffers = mPendingBuffersMap.valueAt(i); 9981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (queued_buffers == stream->max_buffers) { 9991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole max_buffers_dequeued = true; 10001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole break; 10011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!max_buffers_dequeued) { 10041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Unblock process_capture_request 10051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequest = 0; 10061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_cond_signal(&mRequestCond); 10071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 10091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // If the frame number doesn't exist in the pending request list, 10101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // directly send the buffer to the frameworks, and update pending buffers map 10111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Otherwise, book-keep the buffer. 10121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 10131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole while (i != mPendingRequestsList.end() && i->frame_number != frame_number) 10141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i++; 10151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i == mPendingRequestsList.end()) { 10161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Verify all pending requests frame_numbers are greater 10171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin(); 1018e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != mPendingRequestsList.end(); j++) { 10191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->frame_number < frame_number) { 10201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: pending frame number %d is smaller than %d", 10211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole __func__, j->frame_number, frame_number); 10221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 10251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.result = NULL; 102633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang result.frame_number = frame_number; 10271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 1; 10281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = buffer; 1029d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: result frame_number = %d, buffer = %p", 1030e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, frame_number, buffer); 10311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(buffer->stream)--; 1032e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 103333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } else { 10341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1035e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 10361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->stream == buffer->stream) { 10371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer != NULL) { 10381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: buffer is already set", __func__); 10391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 10401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole j->buffer = (camera3_stream_buffer_t *)malloc( 10411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(camera3_stream_buffer_t)); 10421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole *(j->buffer) = *buffer; 1043d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: cache buffer %p at result frame_number %d", 1044e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, buffer, frame_number); 10451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1048e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 10499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 10509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_mutex_unlock(&mRequestLock); 10529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 10539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 10549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 105597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 105697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : translateCbMetadataToResultMetadata 105797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 105897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: 105997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 106097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 106197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @metadata : metadata information from callback 106297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 106397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN : camera_metadata_t* 106497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * metadata in a format specified by fwk 106597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 106697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* 106797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata 10680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (metadata_buffer_t *metadata, nsecs_t timestamp) 106997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 107097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata camMetadata; 107197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camera_metadata_t* resultMetadata; 107297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 107333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 10740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); 107597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 107697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_HISTOGRAM - TODO*/ 107797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*cam_hist_stats_t *histogram = 107897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM, 107997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole metadata);*/ 108097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 108197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*face detection*/ 108297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *) 108397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata); 108497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t numFaces = faceDetectionInfo->num_faces_detected; 108597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceIds[numFaces]; 108697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t faceScores[numFaces]; 108797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceRectangles[numFaces * 4]; 108897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceLandmarks[numFaces * 6]; 108997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int j = 0, k = 0; 109097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < numFaces; i++) { 109197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceIds[i] = faceDetectionInfo->faces[i].face_id; 109297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceScores[i] = faceDetectionInfo->faces[i].score; 109359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(faceDetectionInfo->faces[i].face_boundary, 109497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles+j, -1); 109597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k); 109697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole j+= 4; 109797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole k+= 6; 109897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 109997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces); 110097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces); 110197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES, 110297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles, numFaces*4); 110397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS, 110497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceLandmarks, numFaces*6); 110597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 110697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 110797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*autofocus - TODO*/ 110897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*cam_auto_focus_data_t *afData =(cam_auto_focus_data_t *) 110997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_AUTOFOCUS_DATA,metadata);*/ 111097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11118867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t *color_correct_mode = 11120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata); 111397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1); 111497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 111597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *ae_precapture_id = 111697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata); 111797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1); 111897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 111997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*aec regions*/ 112097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAeRegions = 112197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata); 112297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t aeRegions[5]; 112359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight); 112497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5); 112597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *ae_state = 11270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata); 112897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1); 112997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *focusMode = 11310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata); 113297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1); 113397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 113497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*af regions*/ 113597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAfRegions = 113697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata); 113797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t afRegions[5]; 113859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight); 113997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5); 114097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata); 114297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1); 114397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 114497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *afTriggerId = 114597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata); 114697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1); 114797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalance = 11490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata); 115097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1); 115197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 115297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*awb regions*/ 115397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAwbRegions = 115497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata); 115597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t awbRegions[5]; 115659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight); 115797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5); 115897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalanceState = 11600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata); 116197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1); 116297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata); 116497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_MODE, mode, 1); 116597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata); 116797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1); 116897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashPower = 11700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata); 117197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1); 117297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 117397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *flashFiringTime = 117497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata); 117597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1); 117697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 117797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *ledMode = 117897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata); 117997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/ 118097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashState = 11820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata); 118397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_STATE, flashState, 1); 118497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *hotPixelMode = 11860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata); 118797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1); 118897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 118997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *lensAperture = 119097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata); 119197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1); 119297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 119397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *filterDensity = 119497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata); 119597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1); 119697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 119797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focalLength = 119897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata); 119997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1); 120097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 120197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusDistance = 120297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata); 120397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1); 120497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 120597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusRange = 120697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata); 120797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1); 120897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *opticalStab = 12100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata); 12110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1); 121297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 121397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *focusState = 121497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata); 121597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */ 121697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *noiseRedMode = 12180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata); 121997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1); 122097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 122197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_SCALER_CROP_REGION - check size*/ 122297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_crop_region_t *hScalerCropRegion =(cam_crop_region_t *) 122497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata); 12250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t scalerCropRegion[3]; 12260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[0] = hScalerCropRegion->left; 12270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[1] = hScalerCropRegion->top; 12280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[2] = hScalerCropRegion->width; 12290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 3); 123097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 123197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorExpTime = 123297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata); 123397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1); 123497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 123597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorFameDuration = 123697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata); 123797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1); 123897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 123997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *sensorSensitivity = 124097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata); 124197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1); 124297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *shadingMode = 12440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata); 124597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1); 124697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *faceDetectMode = 12480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata); 124997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1); 125097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *histogramMode = 12520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata); 125397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1); 125497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *sharpnessMapMode = 12560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata); 125797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 125897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole sharpnessMapMode, 1); 125997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 126097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/ 126197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_sharpness_map_t *sharpnessMap = (cam_sharpness_map_t *) 126297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata); 126397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP, 126497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t*)sharpnessMap->sharpness, 126597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT); 126697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 126797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole resultMetadata = camMetadata.release(); 126833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return resultMetadata; 126997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 127097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 127197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 127259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertToRegions 127397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 127497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array 127597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 127697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 127797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @rect : cam_rect_t struct to convert 127897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @region : int32_t destination array 127997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @weight : if we are converting from cam_area_t, weight is valid 128097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * else weight = -1 128197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 128297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 128359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){ 128497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[0] = rect.left; 128597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[1] = rect.top; 128659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[2] = rect.left + rect.width; 128759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[3] = rect.top + rect.height; 128897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (weight > -1) { 128997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[4] = weight; 129097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 129197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 129259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 129359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*=========================================================================== 129459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertFromRegions 129559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 129659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t 129759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 129859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS : 129959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @rect : cam_rect_t struct to convert 130059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @region : int32_t destination array 130159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @weight : if we are converting from cam_area_t, weight is valid 130259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * else weight = -1 130359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 130459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/ 130559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi, 130659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang const camera_metadata_t *settings, 130759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang uint32_t tag){ 130859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang CameraMetadata frame_settings; 130959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang frame_settings = settings; 131059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_min = frame_settings.find(tag).data.i32[0]; 131159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_min = frame_settings.find(tag).data.i32[1]; 131259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_max = frame_settings.find(tag).data.i32[2]; 131359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_max = frame_settings.find(tag).data.i32[3]; 131459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->weight = frame_settings.find(tag).data.i32[4]; 131559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.left = x_min; 131659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.top = y_min; 131759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.width = x_max - x_min; 131859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.height = y_max - y_min; 131959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang} 132059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 132197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 132297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : convertLandmarks 132397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 132497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info 132597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 132697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 132797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @face : cam_rect_t struct to convert 132897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @landmarks : int32_t destination array 132997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 133097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 133197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 133297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks) 133397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 133497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[0] = face.left_eye_center.x; 133597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[1] = face.left_eye_center.y; 133697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[2] = face.right_eye_center.y; 133797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[3] = face.right_eye_center.y; 133897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[4] = face.mouth_center.x; 133997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[5] = face.mouth_center.y; 134097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 134197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 1343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 1345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 1347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 1353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 1354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 1356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 1358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 1359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 1360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 1362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 1363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 1364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 1365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 1366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1368e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 1369e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (capabilityHeap == NULL) { 1370e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: creation of capabilityHeap failed", __func__); 1371e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang goto heap_creation_failed; 1372e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 1374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 1375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 1376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 1377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 1378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 1381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 1382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 1383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 1384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 1385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 1388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 1389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 1392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 1393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 1395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 1398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 1399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 1400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 1403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 1405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 1407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 1408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 1409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 1410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 1411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 1412e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete capabilityHeap; 1413e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed: 1414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 1415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 1416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 1417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1421662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : initParameters 1422662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1423662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters 1424662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1425662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1426662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1427662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1428662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 1429662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1430662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1431662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters() 1432662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1433662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 1434662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1435662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Allocate Set Param Buffer 1436662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = new QCamera3HeapMemory(); 1437662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 1438662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc != OK) { 1439662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = NO_MEMORY; 1440662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("Failed to allocate SETPARM Heap memory"); 1441662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1442662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1443662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1444662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1445662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Map memory for parameters buffer 1447662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 1448662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole CAM_MAPPING_BUF_TYPE_PARM_BUF, 1449662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->getFd(0), 1450662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(parm_buffer_t)); 1451662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc < 0) { 1452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:failed to map SETPARM buffer",__func__); 1453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = FAILED_TRANSACTION; 1454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->deallocate(); 1455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1460662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0); 1461662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1463662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1464662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 146533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION : deinitParameters 146633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 146733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters 146833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 146933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS : 147033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 147133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN : NONE 147233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/ 147333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters() 147433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{ 147533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 147633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF); 147733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 147833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap->deallocate(); 147933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang delete mParamHeap; 148033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap = NULL; 148133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 148233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters = NULL; 148333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang} 148433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 148533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*=========================================================================== 14860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION : calcMaxJpegSize 14870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 14880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId 14890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 14900a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS : 14910a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 14920a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN : max_jpeg_size 14930a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/ 14940a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize() 14950a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{ 14960a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int32_t max_jpeg_size = 0; 14970a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int temp_width, temp_height; 14980a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 14990a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width; 15000a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height; 15010a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab if (temp_width * temp_height > max_jpeg_size ) { 15020a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = temp_width * temp_height; 15030a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 15040a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 15050a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 15060a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab return max_jpeg_size; 15070a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab} 15080a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab 15090a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*=========================================================================== 1510625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 1511625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1512625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 1513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 1519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 1520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 1522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 152497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata staticInfo; 1525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK; 1526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 3 only*/ 15272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 15282dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); */ 15292dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 1530e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang /*hard coded for now but this should come from sensor*/ 1531e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang float min_focus_distance; 1532e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if(facingBack){ 1533e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 10; 1534e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 1535e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 0; 1536e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 1537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 15382dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &min_focus_distance, 1); 1539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 1541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 1542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1543c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*should be using focal lengths but sensor doesn't provide that info now*/ 1544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 1545c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &gCamCapability[cameraId]->focal_length, 1546c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1); 1547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 1549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 1550625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 1551625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 1553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 1554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 1555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 1558c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)gCamCapability[cameraId]->optical_stab_modes, 1559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 1560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 156180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 156280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 156380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 156480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 156580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 156680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 156780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 156880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 156980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 1570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 157180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map, 15720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(gCamCapability[cameraId]->lens_shading_map)/ sizeof(float)); 1573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 157480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 15750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->geo_correction_map_size.height}; 157680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 157780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 157880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 157980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 158080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 158180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 1582c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float)); 158380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 158480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 158580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 158680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 158780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 158880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 158980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 159080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 159180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 159280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 159380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 159480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 1595c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1); 159680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 159780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 159880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 159980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 160080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 160180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 160280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width, 160380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 160480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 160580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang active_array_size, 2); 160680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 160780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 160880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 1609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 161080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 161180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 161280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 161380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 161480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 161580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 161680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 161780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 161880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1619c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 1620c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/ 1621c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*hardcode 0 for now*/ 1622c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang int32_t max_face_count = 0; 162380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 1624c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &max_face_count, 1); 162580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 162680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 162780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 162880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 162980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 163080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 163180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 163280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 163380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 163480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 163580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 163680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 163780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 163880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 163980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 164080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 164180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 164280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 164380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 164480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 164580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1646662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t scalar_formats[CAM_FORMAT_MAX]; 16478867984d33ed870071109a4500402dddbc85c048Shuzhen Wang int scalar_formats_count = gCamCapability[cameraId]->supported_scalar_format_cnt; 16488867984d33ed870071109a4500402dddbc85c048Shuzhen Wang for (int i = 0; i < scalar_formats_count; i++) { 1649662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats[i] = getScalarFormat(gCamCapability[cameraId]->supported_scalar_fmts[i]); 1650662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 16518867984d33ed870071109a4500402dddbc85c048Shuzhen Wang scalar_formats[scalar_formats_count] = HAL_PIXEL_FORMAT_YCbCr_420_888; 16528867984d33ed870071109a4500402dddbc85c048Shuzhen Wang scalar_formats_count++; 1653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 1654662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats, 16558867984d33ed870071109a4500402dddbc85c048Shuzhen Wang scalar_formats_count); 1656662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 16572dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static int32_t available_processed_sizes[CAM_FORMAT_MAX * 2]; 1658662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole makeTable(gCamCapability[cameraId]->supported_sizes_tbl, 1659662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->supported_sizes_tbl_cnt, 1660662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes); 1661662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 1662662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes, 1663c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->supported_sizes_tbl_cnt) * 2); 16640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 16652dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static int32_t available_fps_ranges[MAX_SIZES_CNT * 2]; 16660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl, 16670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->fps_ranges_tbl_cnt, 16680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole available_fps_ranges); 1669c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 1670c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) ); 1671c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1672c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang static const camera_metadata_rational exposureCompensationStep = { 1673c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.numerator, 1674c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.denominator}; 1675c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1676c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &exposureCompensationStep, 1); 1677c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1678c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*TO DO*/ 1679c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang static const uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF}; 1680c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 1681c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableVstabModes, sizeof(availableVstabModes)); 1682c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1683b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang /*HAL 1 and HAL 3 common*/ 1684e3b82c765b3e267c18601aad04159005be581c87Mansoor Aftab static const float maxZoom = 10; 1685c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 1686c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &maxZoom, 1); 1687c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 16882dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static const int32_t max3aRegions = 1; 1689c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_MAX_REGIONS, 1690c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &max3aRegions, 1); 1691c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1692c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang static const uint8_t availableFaceDetectModes[] = { 1693c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_OFF }; 1694c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1695c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 1696c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableFaceDetectModes, 1697c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(availableFaceDetectModes)); 1698c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1699c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang static const int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width, 1700662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->raw_dim.height}; 1701662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 1702662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole raw_size, 1703662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(raw_size)/sizeof(uint32_t)); 1704662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 170580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 170680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 170780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 170880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 170980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 171080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint8_t lensFacing = (facingBack) ? 171280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 171380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 1714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 17152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static int32_t available_jpeg_sizes[MAX_SIZES_CNT * 2]; 1716662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole makeTable(gCamCapability[cameraId]->picture_sizes_tbl, 1717662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->picture_sizes_tbl_cnt, 1718662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_jpeg_sizes); 1719662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 1720662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_jpeg_sizes, 1721c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2)); 1722c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1723c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 1724c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang available_jpeg_sizes, 1725c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2)); 1726662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 172797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole static int32_t max_jpeg_size = 0; 172897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int temp_width, temp_height; 172997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 173097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width; 173197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height; 173297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (temp_width * temp_height > max_jpeg_size ) { 173397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = temp_width * temp_height; 173497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 173597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 173697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 173797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole staticInfo.update(ANDROID_JPEG_MAX_SIZE, 173897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole &max_jpeg_size, 1); 173997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 17400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole static uint8_t avail_effects[CAM_EFFECT_MODE_MAX]; 17410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t size = 0; 1742662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) { 17430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(EFFECT_MODES_MAP, 1744b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]), 17450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_effects[i]); 17460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 17470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_effects[size] = (uint8_t)val; 17480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 17490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1750662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1751662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 1752662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_effects, 17530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1754662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 17550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole static uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX]; 1756e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t supported_indexes[CAM_SCENE_MODE_MAX]; 17572dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang int32_t supported_scene_modes_cnt = 0; 1758662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) { 17590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(SCENE_MODES_MAP, 1760b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 17610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_scene_modes[i]); 17620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 1763e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val; 1764e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_indexes[supported_scene_modes_cnt] = i; 17652dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt++; 17660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1767662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1768e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 1769662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 1770662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_scene_modes, 17712dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt); 1772662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1773e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3]; 1774e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides, 1775e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt, 1776e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 1777e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_indexes); 1778e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 1779e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 1780e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt*3); 1781e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 17820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole static uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX]; 17830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1784662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) { 17850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(ANTIBANDING_MODES_MAP, 1786b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 1787b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[cameraId]->supported_antibandings[i]); 17880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 17890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_antibanding_modes[size] = (uint8_t)val; 17900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 17910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 17920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 1793662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1794662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 1795662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_antibanding_modes, 17960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1797662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1798662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX]; 17990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1800662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) { 18010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FOCUS_MODES_MAP, 1802b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 18030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_focus_modes[i]); 18040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 18050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_af_modes[size] = (uint8_t)val; 18060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 18070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1808662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1809662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 1810662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_af_modes, 18110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1812662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 18130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole static uint8_t avail_awb_modes[CAM_WB_MODE_MAX]; 18140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1815662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) { 18160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP, 1817b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 18180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_white_balances[i]); 18190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 18200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_awb_modes[size] = (uint8_t)val; 18210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 18220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1823662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1824662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 1825662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_awb_modes, 18260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1827662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 18280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole static uint8_t avail_flash_modes[CAM_FLASH_MODE_MAX]; 18290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1830662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) { 18310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FLASH_MODES_MAP, 1832b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FLASH_MODES_MAP)/sizeof(FLASH_MODES_MAP[0]), 18330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_flash_modes[i]); 18340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 18350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_flash_modes[size] = (uint8_t)val; 18360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 18370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1838662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1839e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t flashAvailable = 0; 1840e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (size > 1) { 1841e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang //flash is supported 1842e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang flashAvailable = 1; 1843e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 1844662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_FLASH_MODE, 1845662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_flash_modes, 18460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1847662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1848e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 1849e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE, 1850e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang &flashAvailable, 1); 1851e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 1852e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t avail_ae_modes[5]; 1853e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size = 0; 1854e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) { 1855e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i]; 1856e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size++; 1857e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 1858e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (flashAvailable) { 1859e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; 1860e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; 1861e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; 1862e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 1863662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 1864662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_ae_modes, 1865e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size); 18662dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 1867b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang gStaticMetadata[cameraId] = staticInfo.release(); 1868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1872662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : makeTable 1873662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1874662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes 1875662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1876662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1877662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1878662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1879662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1880662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size, 1881662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t* sizeTable) 1882662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1883662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int j = 0; 1884662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < size; i++) { 1885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j] = dimTable[i].width; 1886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j+1] = dimTable[i].height; 1887662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole j+=2; 1888662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1889662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 18900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 18910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*=========================================================================== 18920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : makeFPSTable 18930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 18940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges 18950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 18960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS : 18970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 18980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/ 18990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size, 1900c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang int32_t* fpsRangesTable) 19010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{ 19020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int j = 0; 19030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < size; i++) { 1904c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps; 1905c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps; 19060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole j+=2; 19070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 19080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole} 19092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 19102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*=========================================================================== 19112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION : makeOverridesList 19122dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 19132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides 19142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 19152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS : 19162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 19172dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 19182dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/ 19192dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable, 1920e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t size, uint8_t* overridesList, 1921e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t* supported_indexes) 19222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{ 19232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*daemon will give a list of overrides for all scene modes. 19242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang However we should send the fwk only the overrides for the scene modes 19252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported by the framework*/ 1926e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int j = 0, index = 0; 19272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang for (int i = 0; i < size; i++) { 1928e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang index = supported_indexes[i]; 1929e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang overridesList[j] = (int32_t)overridesTable[index].ae_mode; 1930e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang overridesList[j+1] = (int32_t)overridesTable[index].awb_mode; 1931e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang overridesList[j+2] = (int32_t)overridesTable[index].af_mode; 19322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang j+=3; 19332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang } 19342dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang} 19352dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 1937662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : getPreviewHalPixelFormat 1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework 1940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend 1942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN : format recognized by framework 1944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1945662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1946662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format) 1947662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1948662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t halPixelFormat; 1949662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1950662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole switch (format) { 1951662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV12: 1952662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; 1953662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 1954662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21: 1955662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 1956662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 1957662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21_ADRENO: 1958662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO; 1959662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 1960662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_YV12: 1961662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YV12; 1962662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 1963662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV16: 1964662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV61: 1965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole default: 1966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 1967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 1968662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1969662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return halPixelFormat; 1970662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1971662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1972662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 1973662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : AddSetParmEntryToBatch 1974662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1975662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch 1976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1978662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @p_table : ptr to parameter buffer 1979662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramType : parameter type 1980662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramLength : length of parameter value 1981662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramValue : ptr to parameter value 1982662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1983662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1984662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 1985662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1986662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1987662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table, 1988662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole cam_intf_parm_type_t paramType, 1989662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint32_t paramLength, 1990662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole void *paramValue) 1991662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1992662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int position = paramType; 1993662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int current, next; 1994662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1995662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 1996662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Code to take care of linking next flags * 1997662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 1998662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_FIRST_PARAM_ID(p_table); 1999662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position == current){ 2000662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //DO NOTHING 2001662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else if (position < current){ 2002662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, current); 2003662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_FIRST_PARAM_ID(p_table, position); 2004662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 2005662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /* Search for the position in the linked list where we need to slot in*/ 2006662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole while (position > GET_NEXT_PARAM_ID(current, p_table)) 2007662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_NEXT_PARAM_ID(current, p_table); 2008662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2009662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*If node already exists no need to alter linking*/ 2010662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position != GET_NEXT_PARAM_ID(current, p_table)) { 2011662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole next = GET_NEXT_PARAM_ID(current, p_table); 2012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(current, p_table, position); 2013662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, next); 2014662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2015662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2016662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2017662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2018662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Copy contents into entry * 2019662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2020662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2021662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (paramLength > sizeof(parm_type_t)) { 2022662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:Size of input larger than max entry size",__func__); 2023662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2024662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2025662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength); 2026662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NO_ERROR; 2027662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2028662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2029662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2030662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupFwkName 2031662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2032662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2033662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2034662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2035662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2036662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2037662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2038662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @hal_name : name of the hal_parm to map 2039662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2040662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int type of status 2041662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * fwk_name -- success 2042662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2043662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 20440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[], 2045662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int hal_name) 2046662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2047662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2048d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (int i = 0; i < len; i++) { 2049d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang if (arr[i].hal_name == hal_name) 2050d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return arr[i].fwk_name; 2051662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2052d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 2053d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* Not able to find matching framework type is not necessarily 2054d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * an error case. This happens when mm-camera supports more attributes 2055d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * than the frameworks do */ 2056d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Cannot find matching framework type", __func__); 2057d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return NAME_NOT_FOUND; 2058662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2059662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2060662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2061662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupHalName 2062662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2063662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2064662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2065662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2066662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2067662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2068662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2069662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @fwk_name : name of the hal_parm to map 2070662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2071662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2072662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * hal_name -- success 2073662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2074662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 20750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[], 2076662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int fwk_name) 2077662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2078662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 2079662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].fwk_name == fwk_name) 2080662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].hal_name; 2081662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 20820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Cannot find matching hal type", __func__); 2083662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NAME_NOT_FOUND; 2084662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2085662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2086662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2087625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 2088625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2089625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 2090625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2091625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2092625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 2094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 2097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 2098625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2099625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 2100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 2101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 2103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 2105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 2106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 2108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2111625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2112b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang if (NULL == gStaticMetadata[cameraId]) { 2113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 2114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 2120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 2121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 2122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 2125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 2126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 2130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 2131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 2136e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0); 2137b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang info->static_camera_characteristics = gStaticMetadata[cameraId]; 2138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 2144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 2146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 2148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 2151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 2152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 215497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type) 2155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2156e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 2157e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 2159e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 2163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 216497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata settings; 2165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 2166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 2167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 2168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 2170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 2172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 2173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 2174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 2175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 2177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 2178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 2180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 2181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 2183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 2184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 2186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 2187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 2190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 2193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 21949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 21959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 2196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 2198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 2199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 2201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 2202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 2204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 2205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 2207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 2208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 2210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 2211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 2213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 2214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2215e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t focusMode; 2216e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) { 2217e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to auto", __func__); 2218e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_AUTO; 2219e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2220e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to off", __func__); 2221e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_OFF; 2222e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 22232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1); 22242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 22252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; 22262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 22272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 2229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 2230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 2231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 2234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_aperture = gCamCapability[mCameraId]->apertures[0]; 2235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 2236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2237b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang if (gCamCapability[mCameraId]->filter_densities_count) { 2238b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 2239b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 2240b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[mCameraId]->filter_densities_count); 2241b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang } 2242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2243b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang /* TODO: Enable focus lengths once supported*/ 2244b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang /*if (gCamCapability[mCameraId]->focal_lengths_count) { 2245b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0]; 2246b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 2247b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang }*/ 2248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 2250e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2251e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 225680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 225780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 225880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 225980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 226080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 226180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 226280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 226380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 226480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 226580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 226680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 226780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 2268662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id, 2269662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const camera_metadata_t *settings) 227080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 227180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 227280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 227333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (settings == NULL && mFirstRequest) { 227480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 227580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 2276662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 227733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2278b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 2279b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang 2280b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 228133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 2282b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 2283b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(hal_version), &hal_version); 228433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2285662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*we need to update the frame number in the parameters*/ 2286662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 2287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(frame_id), &frame_id); 2288662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (rc < 0) { 2289662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s: Failed to set the frame number in the parameters", __func__); 2290662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2291662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 22920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2293662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(settings != NULL){ 22941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = translateMetadataToParameters(settings); 229580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 229680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 2297662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 229880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 229980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 230080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 230180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 230280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 230380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 230480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 230580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 230680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 230780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 230880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 230980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 231080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 231180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 231280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 231380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 231480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 231580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (const camera_metadata_t *settings) 231680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 231897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata frame_settings; 2319662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole frame_settings = settings; 2320662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 23210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 23220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) { 23230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t antibandingMode = 23240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0]; 23250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING, 23260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(antibandingMode), &antibandingMode); 23270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 232897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 232997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t expCompensation = frame_settings.find().data.i32[0]; 23300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION, 233197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole sizeof(expCompensation), &expCompensation);*/ 23320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) { 23330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0]; 23340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK, 23350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeLock), &aeLock); 23360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 233797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 23380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) { 23390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_fps_range_t fps_range; 23400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.min_fps = 23410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 23420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.max_fps = 23430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 23440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE, 23450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(fps_range), &fps_range); 23460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 234797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 23480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) { 23492dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang uint8_t fwk_focusMode = 23500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0]; 23512dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang uint8_t focusMode = lookupHalName(FOCUS_MODES_MAP, 23522dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang sizeof(FOCUS_MODES_MAP), 23532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang fwk_focusMode); 23540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE, 23550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focusMode), &focusMode); 23560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2357662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 23580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) { 23590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t awbLock = 23600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0]; 23610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK, 23620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(awbLock), &awbLock); 23630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 23640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 23650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) { 23660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_whiteLevel = 23670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0]; 23680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP, 23690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(WHITE_BALANCE_MODES_MAP), 23700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_whiteLevel); 23710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE, 23720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(whiteLevel), &whiteLevel); 23730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 23740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 23750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) { 23760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_effectMode = 23770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0]; 23780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP, 23790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(EFFECT_MODES_MAP), 23800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_effectMode); 23810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT, 23820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(effectMode), &effectMode); 23830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 23840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 23850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 23860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_aeMode = 23870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 2388e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t aeMode; 2389e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t redeye; 2390e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) { 2391e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_OFF; 2392e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2393e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_ON; 2394e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2395e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 2396e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 1; 2397e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2398e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 0; 2399e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2400e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP, 2401e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(AE_FLASH_MODE_MAP), 2402e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode); 24030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE, 24040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeMode), &aeMode); 2405e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 2406e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(flashMode), &flashMode); 2407e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION, 2408e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(redeye), &redeye); 24090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_REQUEST_FRAME_COUNT)) { 24120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t metaFrameNumber = 24130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_REQUEST_FRAME_COUNT).data.i32[0]; 24140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 24150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(metaFrameNumber), &metaFrameNumber); 24160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) { 24190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t colorCorrectMode = 24200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0]; 24210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = 24220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE, 24230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(colorCorrectMode), &colorCorrectMode); 24240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2425e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang cam_trigger_t aecTrigger; 2426e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE; 2427e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger_id = -1; 24282dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&& 24292dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) { 24302dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger = 24310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0]; 24322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger_id = 24332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0]; 24340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, 24361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(aecTrigger), &aecTrigger); 24370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24382dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*af_trigger must come with a trigger id*/ 24392dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) && 24402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) { 24412dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang cam_trigger_t af_trigger; 24422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger = 24430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0]; 24442dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger_id = 24452dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0]; 24460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 24472dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger); 24480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_MODE)) { 24510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0]; 24520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE, 24530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(metaMode), &metaMode); 24540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) { 24570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t demosaic = 24580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0]; 24590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC, 24600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(demosaic), &demosaic); 24610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_MODE)) { 24640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 24650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE, 24660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(edgeMode), &edgeMode); 24670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) { 24700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t edgeStrength = 24710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0]; 24720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 24730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength); 24740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2476e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (frame_settings.exists(ANDROID_FLASH_MODE)) { 2477e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t flashMode = 2478e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang frame_settings.find(ANDROID_FLASH_MODE).data.u8[0]; 2479e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 2480e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang CAM_INTF_META_FLASH_MODE, sizeof(flashMode), &flashMode); 2481e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2482e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 24830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) { 24840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t flashPower = 24850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0]; 24860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER, 24870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(flashPower), &flashPower); 24880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) { 24910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t flashFiringTime = 24920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0]; 24930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 24940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime); 24950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) { 24980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t geometricMode = 24990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0]; 25000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE, 25010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricMode), &geometricMode); 25020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) { 25058867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t geometricStrength = 25060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0]; 25070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_GEOMETRIC_STRENGTH, 25090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricStrength), &geometricStrength); 25100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) { 25130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t hotPixelMode = 25140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0]; 25150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE, 25160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(hotPixelMode), &hotPixelMode); 25170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_APERTURE)) { 25200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float lensAperture = 25210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find( ANDROID_LENS_APERTURE).data.f[0]; 25220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE, 25230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(lensAperture), &lensAperture); 25240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) { 25270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float filterDensity = 25280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0]; 25290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY, 25300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(filterDensity), &filterDensity); 25310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 25340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float focalLength = 25350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 25360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_FOCAL_LENGTH, 25380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focalLength), &focalLength); 25390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) { 25420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float focalDistance = 25430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0]; 25448867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 25450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_FOCUS_DISTANCE, 25460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focalDistance), &focalDistance); 25470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) { 25500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t optStabMode = 25510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0]; 25528867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 25530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_OPT_STAB_MODE, 25540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(optStabMode), &optStabMode); 25550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) { 25580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedMode = 25590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]; 25608867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 25610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_MODE, 25620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedMode), &noiseRedMode); 25630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) { 25660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedStrength = 25670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0]; 25688867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 25690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_STRENGTH, 25700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedStrength), &noiseRedStrength); 25710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) { 25740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_crop_region_t scalerCropRegion; 25750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.left = 25760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0]; 25770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.top = 25780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1]; 25790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.width = 25800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2]; 25810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SCALER_CROP_REGION, 25830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(scalerCropRegion), &scalerCropRegion); 25840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { 25870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorExpTime = 25880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0]; 25890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_EXPOSURE_TIME, 25910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorExpTime), &sensorExpTime); 25920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) { 25950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorFrameDuration = 25960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0]; 25970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_FRAME_DURATION, 25990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorFrameDuration), &sensorFrameDuration); 26000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 26030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t sensorSensitivity = 26040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 26050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_SENSITIVITY, 26070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorSensitivity), &sensorSensitivity); 26080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_MODE)) { 26110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t shadingMode = 26120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_MODE).data.u8[0]; 26130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE, 26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingMode), &shadingMode); 26150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) { 26180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t shadingStrength = 26190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0]; 26200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH, 26210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingStrength), &shadingStrength); 26220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) { 26250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t facedetectMode = 26260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0]; 26270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_FACEDETECT_MODE, 26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(facedetectMode), &facedetectMode); 26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) { 26330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t histogramMode = 26340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0]; 26350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_HISTOGRAM_MODE, 26370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(histogramMode), &histogramMode); 26380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) { 26410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t sharpnessMapMode = 26420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0]; 26430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, 26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sharpnessMapMode), &sharpnessMapMode); 26460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_TONEMAP_MODE)) { 26490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t tonemapMode = 26500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0]; 26510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_TONEMAP_MODE, 26530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(tonemapMode), &tonemapMode); 26540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 26570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t captureIntent = 26580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 26590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 26600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(captureIntent), &captureIntent); 26610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2662662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 266359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) { 266459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 266559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertFromRegions(&roi, settings, ANDROID_CONTROL_AE_REGIONS); 266659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI, 266759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang sizeof(roi), &roi); 266859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 266959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 267059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) { 267159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 267259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertFromRegions(&roi, settings, ANDROID_CONTROL_AF_REGIONS); 267359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI, 267459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang sizeof(roi), &roi); 267559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 267659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 267759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) { 267859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 267959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertFromRegions(&roi, settings, ANDROID_CONTROL_AWB_REGIONS); 268059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS, 268159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang sizeof(roi), &roi); 268259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 2683662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 2684662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2685662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2686662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 26870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : getJpegSettings 2688662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 26890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL 2690662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2691662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2692662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2693662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @settings : frame settings information from framework 2694662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2695662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2696662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : success: NO_ERROR 2697662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * failure: 2698662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2699662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings 2700662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (const camera_metadata_t *settings) 2701662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2702662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (mJpegSettings) { 2703662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole free(mJpegSettings); 2704662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = NULL; 2705662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2706662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t)); 270797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata jpeg_settings; 2708662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings = settings; 2709662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 27100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) { 27110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 27120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0]; 27130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 27140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 0; 27150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) { 27170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_quality = 27180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0]; 27190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 27201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mJpegSettings->jpeg_quality = 85; 27210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) { 27230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.width = 27240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0]; 27250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.height = 27260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1]; 2727f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mJpegSettings->thumbnail_size.width = 320; 2728f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mJpegSettings->thumbnail_size.height = 240; 27290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 27300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.width = 640; 27310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.height = 480; 27320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) { 27340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < 3; i++) { 27350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->gps_coordinates[i] = 27360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i]; 27370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { 27400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->gps_timestamp = 27410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0]; 27420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { 27450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->gps_processing_method = 27460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[0]; 27470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 27490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->sensor_sensitivity = 27500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 27510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 27530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->lens_focal_length = 27540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 27550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27560a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab mJpegSettings->max_jpeg_size = calcMaxJpegSize(); 275780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 275880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 275980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 276080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 2761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 2762625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2763625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 2764625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2765625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2766625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 2767625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 2768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 2769625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2770625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 2771625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 27721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata, 2773e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, 2774e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frame_number, void *userdata) 2775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 2777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 2778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 2779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 2780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->captureResultCb(metadata, buffer, frame_number); 2783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 2784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2785625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 2788625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2789625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 2790625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2791625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2794625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 2795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 2796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2797625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 2799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 2800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2801d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 2802625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 2803625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2804625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 2805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 2807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 28091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->initialize(callback_ops); 2810d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 28111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 2812625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2813625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2814625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 2816625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2817625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 2818625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2819625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2820625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 2823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 2824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 2825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 2828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 2829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 2830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2831d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 2832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 2833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 2835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 2837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 28381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->configureStreams(stream_list); 2839d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 28401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 2841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 2845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 2847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 2851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 2853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 2854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 2855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2856d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 2857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 2858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 2860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 2862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 28631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->registerStreamBuffers(buffer_set); 2864d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 28651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 2866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 2870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 2872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 2877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 2878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 28799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 28809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 28819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 2882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2884d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 2885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 2886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 2887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 2889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 2891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 289397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole fwk_metadata = hw->translateCapabilityToMetadata(type); 2894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2895d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 2896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 2897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 2901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 2903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 2908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 29099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 29109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 29119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 2912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2913d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 291480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 291580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 291680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 291780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 29189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 291980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 29209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 29211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->processCaptureRequest(request); 2922d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 29231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 2924625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2925625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2926625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2927625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 2928625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2929625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 2930625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2931625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2932625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2933625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 2935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2937e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops( 2938e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, 2939e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang vendor_tag_query_ops_t* ops) 2940625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2941d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 2942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 2943e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2944e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 2945e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2946e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2947e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 2948e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2949e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->getMetadataVendorTagOps(ops); 2950d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 2951e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2952625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2953625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2954625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2955625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 2956625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2957625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 2958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2959625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2960625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 2963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump( 2966e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, int fd) 2967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2968d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 2969e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 2970e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2971e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 2972e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2973e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 2975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2976e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->dump(fd); 2977d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 2978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2979625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2980625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2981e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 2982e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : close_camera_device 2983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 2985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2986e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 2987e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2988e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2989e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 2990e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 2991e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 2992e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 2993d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 2994e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int ret = NO_ERROR; 2995e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 2996e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>( 2997e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<camera3_device_t *>(device)->priv); 2998e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 2999e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("NULL camera device"); 3000e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return BAD_VALUE; 3001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3002e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete hw; 3003d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3004e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return ret; 3005e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 3006e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3007625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 3008