QCamera3HWI.cpp revision dd60b0cec98a84145dd88747b5cb642da3123802
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" 3114dfc272241ba78c85a327da2872e71b3208f8c5Shuzhen Wang//#define LOG_NDEBUG 0 32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 33625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <cutils/properties.h> 34625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h> 35625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <camera/CameraMetadata.h> 36625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <stdlib.h> 37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h> 38625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h> 39e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <ui/Fence.h> 40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h> 41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h" 42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h" 43625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h" 4466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h" 45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android; 47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera { 4962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 5062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang#define MAX(a, b) ((a) > (b) ? (a) : (b)) 5162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 53625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS]; 5480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings; 55b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS]; 56625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 57cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangpthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock = 58cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang PTHREAD_MUTEX_INITIALIZER; 59cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangunsigned int QCamera3HardwareInterface::mCameraSessionActive = 0; 60cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = { 62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_OFF, CAM_EFFECT_MODE_OFF }, 63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_MONO, CAM_EFFECT_MODE_MONO }, 64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE, CAM_EFFECT_MODE_NEGATIVE }, 65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE, CAM_EFFECT_MODE_SOLARIZE }, 66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SEPIA, CAM_EFFECT_MODE_SEPIA }, 67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE, CAM_EFFECT_MODE_POSTERIZE }, 68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD }, 69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD }, 70662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_AQUA, CAM_EFFECT_MODE_AQUA } 71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = { 740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_OFF, CAM_WB_MODE_OFF }, 75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_AUTO, CAM_WB_MODE_AUTO }, 76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_INCANDESCENT, CAM_WB_MODE_INCANDESCENT }, 77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_FLUORESCENT, CAM_WB_MODE_FLUORESCENT }, 78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT}, 79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_DAYLIGHT, CAM_WB_MODE_DAYLIGHT }, 80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT }, 81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_TWILIGHT, CAM_WB_MODE_TWILIGHT }, 82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_SHADE, CAM_WB_MODE_SHADE } 83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = { 8634296c8a11c87ca1c00cfaedddd1f9089344ee80Shuzhen Wang { ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY, CAM_SCENE_MODE_OFF }, 87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_ACTION, CAM_SCENE_MODE_ACTION }, 88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PORTRAIT, CAM_SCENE_MODE_PORTRAIT }, 89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE, CAM_SCENE_MODE_LANDSCAPE }, 90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT, CAM_SCENE_MODE_NIGHT }, 91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT }, 92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_THEATRE, CAM_SCENE_MODE_THEATRE }, 93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BEACH, CAM_SCENE_MODE_BEACH }, 94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SNOW, CAM_SCENE_MODE_SNOW }, 95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SUNSET, CAM_SCENE_MODE_SUNSET }, 96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO, CAM_SCENE_MODE_ANTISHAKE }, 97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_FIREWORKS , CAM_SCENE_MODE_FIREWORKS }, 98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SPORTS , CAM_SCENE_MODE_SPORTS }, 99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PARTY, CAM_SCENE_MODE_PARTY }, 100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT, CAM_SCENE_MODE_CANDLELIGHT }, 10197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BARCODE, CAM_SCENE_MODE_BARCODE} 102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = { 105b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang { ANDROID_CONTROL_AF_MODE_OFF, CAM_FOCUS_MODE_FIXED }, 106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_AUTO, CAM_FOCUS_MODE_AUTO }, 107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_MACRO, CAM_FOCUS_MODE_MACRO }, 108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_EDOF, CAM_FOCUS_MODE_EDOF }, 109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE }, 110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO, CAM_FOCUS_MODE_CONTINOUS_VIDEO } 111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = { 114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, CAM_ANTIBANDING_MODE_OFF }, 115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ }, 116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ }, 117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO } 118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = { 121e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_OFF, CAM_FLASH_MODE_OFF }, 122e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON, CAM_FLASH_MODE_OFF }, 123e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH, CAM_FLASH_MODE_AUTO}, 124e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH, CAM_FLASH_MODE_ON }, 125e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO} 126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = { 129662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_OFF, CAM_FLASH_MODE_OFF }, 1306356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE }, 1316356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani { ANDROID_FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH } 132662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 133662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1346990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FACEDETECT_MODES_MAP[] = { 1356990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang { ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, CAM_FACE_DETECT_MODE_OFF }, 1366990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang { ANDROID_STATISTICS_FACE_DETECT_MODE_FULL, CAM_FACE_DETECT_MODE_FULL } 1376990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang}; 1386990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang 13908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288, 14008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab 320, 240, 176, 144, 0, 0}; 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = { 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang initialize: QCamera3HardwareInterface::initialize, 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang configure_streams: QCamera3HardwareInterface::configure_streams, 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang register_stream_buffers: QCamera3HardwareInterface::register_stream_buffers, 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings, 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang process_capture_request: QCamera3HardwareInterface::process_capture_request, 148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang get_metadata_vendor_tag_ops: QCamera3HardwareInterface::get_metadata_vendor_tag_ops, 149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang dump: QCamera3HardwareInterface::dump, 150c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang flush: QCamera3HardwareInterface::flush, 151c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang reserved: {0}, 152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; 153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 154f060ebe7f00ea62a029df01482e32b1d57c3efe6Mansoor Aftabint QCamera3HardwareInterface::kMaxInFlight = 5; 155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3HardwareInterface 158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface 160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera ID 163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId) 167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang : mCameraId(cameraId), 168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle(NULL), 169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened(false), 170cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraInitialized(false), 17197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mCallbackOps(NULL), 17233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mInputStream(NULL), 17333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mMetadataChannel(NULL), 1747ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel(NULL), 17533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest(false), 17633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap(NULL), 17733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters(NULL), 17899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan mJpegSettings(NULL), 1798bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode(false), 18062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinProcessedFrameDuration(0), 18162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinJpegFrameDuration(0), 18262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinRawFrameDuration(0), 183dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab m_pPowerModule(NULL), 184dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab mHdrHint(false) 185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 187e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0; 188e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.close = close_camera_device; 189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.ops = &mCameraOps; 190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.priv = this; 191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->version = CAM_HAL_V3; 1927ee407aa1024789089aad411c372c79423699976Ajay Dudani // TODO: hardcode for now until mctl add support for min_num_pp_bufs 1937ee407aa1024789089aad411c372c79423699976Ajay Dudani //TBD - To see if this hardcoding is needed. Check by printing if this is filled by mctl to 3 1947ee407aa1024789089aad411c372c79423699976Ajay Dudani gCamCapability[cameraId]->min_num_pp_bufs = 3; 1959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_init(&mRequestCond, NULL); 1979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 19874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = -1; 199e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_init(&mMutex, NULL); 20033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 20133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 20233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mDefaultMetadata[i] = NULL; 20399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan 20499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 20599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) { 20699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID); 20799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 20899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 21466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface 215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 222d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 223d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* We need to stop all streams before deleting any stream */ 224d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab /*flush the metadata list*/ 225d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!mStoredMetadataList.empty()) { 226d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 227d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 228d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 229d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 230d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 231d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 232d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 2331fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang 2341fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang // NOTE: 'camera3_stream_t *' objects are already freed at 2351fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang // this stage by the framework 2361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 2371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 2381fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang QCamera3Channel *channel = (*it)->channel; 2391fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang if (channel) { 2401fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang channel->stop(); 2411fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang } 242d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang } 2431fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang 244d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 245d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang it != mStreamInfo.end(); it++) { 2461fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang QCamera3Channel *channel = (*it)->channel; 2470f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang if ((*it)->registered && (*it)->buffer_set.buffers) { 2480f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang delete[] (buffer_handle_t*)(*it)->buffer_set.buffers; 2490f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang } 250dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (channel) 251dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang delete channel; 2521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free (*it); 2531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 2541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 2557ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel = NULL; 2567ee407aa1024789089aad411c372c79423699976Ajay Dudani 25797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (mJpegSettings != NULL) { 25897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole free(mJpegSettings); 25997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mJpegSettings = NULL; 26097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 261dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 262dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang /* Clean up all channels */ 263dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (mCameraInitialized) { 2644e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang if (mMetadataChannel) { 2654e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang mMetadataChannel->stop(); 2664e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang delete mMetadataChannel; 2674e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang mMetadataChannel = NULL; 2684e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang } 269dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang deinitParameters(); 270dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang } 271dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 272cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraOpened) 273cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang closeCamera(); 274e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 27533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 27633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (mDefaultMetadata[i]) 27733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang free_camera_metadata(mDefaultMetadata[i]); 27833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 279e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_cond_destroy(&mRequestCond); 280e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 281e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mMutex); 282d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 300cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 301cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraSessionActive) { 302cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang ALOGE("%s: multiple simultaneous camera instance not supported", __func__); 303cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 304249d8d801ab218ff4920e57fdd4ccf17e1626057Zhijun He return -EUSERS; 305cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } 306cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 313cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (rc == 0) { 314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 315cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 1; 316cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } else 317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 318cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 31999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 32099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == 0) { 32199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 32299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 32399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 32499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=1"); 32599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 32699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 32799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 32899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 329cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 38099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 38199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == NO_ERROR) { 38299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 38399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 384dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab if(mHdrHint == true) { 385dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 386dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab (void *)"state=3"); 387dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab mHdrHint = false; 388dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab } 38999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 39099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=0"); 39199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 39299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 39399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 39499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 39599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan 396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 4139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 415e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 416e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 41733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang rc = initParameters(); 41833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (rc < 0) { 41933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang ALOGE("%s: initParamters failed %d", __func__, rc); 42033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang goto err1; 42133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } 4229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCallbackOps = callback_ops; 423e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 424e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 425cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraInitialized = true; 4269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 4279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 4289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1: 429e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 4309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 44833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int rc = 0; 449d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mIsZslMode = false; 45062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang 451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /* first invalidate all the steams in the mStreamList 4680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * if they appear again, they will be validated */ 4691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 471d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 472d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang channel->stop(); 4730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = INVALID; 4740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 47562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang if (mMetadataChannel) { 47662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang /* If content of mStreamInfo is not 0, there is metadata stream */ 47762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang mMetadataChannel->stop(); 47862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang } 47962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang 480dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab#ifdef HAS_MULTIMEDIA_HINTS 481dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab if(mHdrHint == true) { 482dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab if (m_pPowerModule) { 483dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab if (m_pPowerModule->powerHint) { 484dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 485dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab (void *)"state=3"); 486dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab mHdrHint = false; 487dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab } 488dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab } 489dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab } 490dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab#endif 491dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab 49262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang pthread_mutex_lock(&mMutex); 49362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang 49462595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang camera3_stream_t *inputStream = NULL; 49562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang camera3_stream_t *jpegStream = NULL; 49662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang cam_stream_size_info_t stream_config_info; 497d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 499625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 500c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d", 501c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, newStream->stream_type, newStream->format, 502c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang newStream->width, newStream->height); 5030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //if the stream is in the mStreamList validate it 5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole bool stream_exists = false; 5051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 5061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 5070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if ((*it)->stream == newStream) { 5081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = 5091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (QCamera3Channel*)(*it)->stream->priv; 5100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_exists = true; 5110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = RECONFIGURE; 5121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*delete the channel object associated with the stream because 5131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole we need to reconfigure*/ 5141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 5151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->stream->priv = NULL; 5161fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang (*it)->channel = NULL; 5170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (!stream_exists) { 5200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //new stream 5210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info_t* stream_info; 5220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info = (stream_info_t* )malloc(sizeof(stream_info_t)); 5230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->stream = newStream; 5240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->status = VALID; 5251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole stream_info->registered = 0; 5261fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang stream_info->channel = NULL; 5270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mStreamInfo.push_back(stream_info); 5280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 529c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT 530c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) { 531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 532625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 533e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 536625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 538c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->format == HAL_PIXEL_FORMAT_BLOB) { 539c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream = newStream; 540c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 5440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /*clean up invalid streams*/ 5451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 5461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end();) { 5470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if(((*it)->status) == INVALID){ 5481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 5491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 5500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole delete[] (buffer_handle_t*)(*it)->buffer_set.buffers; 5510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole free(*it); 5521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it = mStreamInfo.erase(it); 5531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 5541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it++; 5550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 55762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang if (mMetadataChannel) { 55862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang delete mMetadataChannel; 55962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang mMetadataChannel = NULL; 56062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang } 561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 56262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang //Create metadata channel and initialize it 56362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 56462595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang mCameraHandle->ops, captureResultCb, 56562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this); 56662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang if (mMetadataChannel == NULL) { 56762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang ALOGE("%s: failed to allocate metadata channel", __func__); 56862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang rc = -ENOMEM; 56962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang pthread_mutex_unlock(&mMutex); 57062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang return rc; 57162595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang } 57262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang rc = mMetadataChannel->initialize(); 57362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang if (rc < 0) { 57462595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang ALOGE("%s: metadata channel initialization failed", __func__); 57562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang delete mMetadataChannel; 576f49d780c0f2fc137a3463e06537706d8829d6da5Shuzhen Wang mMetadataChannel = NULL; 57762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang pthread_mutex_unlock(&mMutex); 57862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang return rc; 57962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang } 580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 584dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang uint32_t stream_usage = newStream->usage; 585d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].width = newStream->width; 586d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].height = newStream->height; 587d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 588d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang newStream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && jpegStream){ 589d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang //for zsl stream the size is jpeg size 590d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].width = jpegStream->width; 591d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].height = jpegStream->height; 592dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_SNAPSHOT; 593dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang } else { 594dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang //for non zsl streams find out the format 595dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang switch (newStream->format) { 596dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED : 597dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang { 598dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang if (stream_usage & private_handle_t::PRIV_FLAGS_VIDEO_ENCODER) { 599dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_VIDEO; 600dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang } else { 601dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_PREVIEW; 602dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang } 603dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang } 604dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang break; 605dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang case HAL_PIXEL_FORMAT_YCbCr_420_888: 606dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_CALLBACK; 607dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab#ifdef HAS_MULTIMEDIA_HINTS 608dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab if (m_pPowerModule) { 609dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab if (m_pPowerModule->powerHint) { 610dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab m_pPowerModule->powerHint(m_pPowerModule, 611dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab POWER_HINT_VIDEO_ENCODE, (void *)"state=2"); 612dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab mHdrHint = true; 613dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab } 614dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab } 615dd60b0cec98a84145dd88747b5cb642da3123802Mansoor Aftab#endif 616dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang break; 617dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang case HAL_PIXEL_FORMAT_BLOB: 618dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT; 619dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang break; 620dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang default: 621dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_DEFAULT; 622dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang break; 623dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang } 624d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang } 625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 628f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_INPUT: 629f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 630f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 631f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_BIDIRECTIONAL: 632f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 633f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab GRALLOC_USAGE_HW_CAMERA_WRITE; 634f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 635f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_OUTPUT: 636c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /* For video encoding stream, set read/write rarely 637c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * flag so that they may be set to un-cached */ 638c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) 639c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang newStream->usage = 640c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang (GRALLOC_USAGE_SW_READ_RARELY | 641c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang GRALLOC_USAGE_SW_WRITE_RARELY | 642c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang GRALLOC_USAGE_HW_CAMERA_WRITE); 643c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang else 644c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 645f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 646f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 647f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 648f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 6521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 655f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 6568867984d33ed870071109a4500402dddbc85c048Shuzhen Wang case HAL_PIXEL_FORMAT_YCbCr_420_888: 657f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 658c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 659c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream) { 660c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t width = jpegStream->width; 661c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t height = jpegStream->height; 6628bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode = true; 663c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 664c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mCameraHandle->ops, captureResultCb, 665c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this, newStream, 666c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang width, height); 667c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else 668c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 669f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 670f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 671f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 672f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 673f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 674f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 675f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 676f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 677f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 678f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 679f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_BLOB: 680f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 6817ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle, 682f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 683f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 6847ee407aa1024789089aad411c372c79423699976Ajay Dudani if (mPictureChannel == NULL) { 685f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 686f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 687f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 688f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 6897ee407aa1024789089aad411c372c79423699976Ajay Dudani newStream->priv = (QCamera3Channel*)mPictureChannel; 690f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 691f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 692f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab //TODO: Add support for app consumed format? 693f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 694f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 695f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 6981fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang 6991fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 7001fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang it != mStreamInfo.end(); it++) { 7011fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang if ((*it)->stream == newStream) { 7021fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang (*it)->channel = (QCamera3Channel*) newStream->priv; 7031fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang break; 7041fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang } 7051fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang } 706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 711bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang 712bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 713bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang stream_config_info.num_streams = streamList->num_streams; 714bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang 715bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang // settings/parameters don't carry over for new configureStreams 716bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 717bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang 718bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 719bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 720bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang sizeof(hal_version), &hal_version); 721bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang 722bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_INFO, 723bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang sizeof(stream_config_info), &stream_config_info); 724bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang 725bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 726bc69b970ecb783db68cccad88220340c08ee17a5Shuzhen Wang 7278867984d33ed870071109a4500402dddbc85c048Shuzhen Wang /*For the streams to be reconfigured we need to register the buffers 7281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole since the framework wont*/ 7291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 7301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 7311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->status == RECONFIGURE) { 7321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 7331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*only register buffers for streams that have already been 7341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole registered*/ 7351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->registered) { 7361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = channel->registerBuffers((*it)->buffer_set.num_buffers, 7371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers); 7381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (rc != NO_ERROR) { 7391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Failed to register the buffers of old stream,\ 7401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = %d", __func__, rc); 7411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 742a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: channel %p has %d buffers", 743e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, channel, (*it)->buffer_set.num_buffers); 7440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 7471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream); 7481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (index == NAME_NOT_FOUND) { 7491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.add((*it)->stream, 0); 7501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 7511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueAt(index) = 0; 7521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 7530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 7551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Initialize mPendingRequestInfo and mPendnigBuffersMap */ 7561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.clear(); 7571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 75845465b8d86296ba7aeeb1ee4f9ba07b4bddf1652Shuzhen Wang mPendingFrameDropList.clear(); 75945465b8d86296ba7aeeb1ee4f9ba07b4bddf1652Shuzhen Wang 760d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab /*flush the metadata list*/ 761d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!mStoredMetadataList.empty()) { 762d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 763d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 764d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 765d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 766d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 767d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 768d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 769d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang 77033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest = true; 77133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 77262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Get min frame duration for this streams configuration 77362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang deriveMinFrameDuration(); 77462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 775e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 77633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return rc; 777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 780e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : validateCaptureRequest 781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service 78380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 78480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 78580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 78680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 78780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 78880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 78980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest( 7919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 79280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 7939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 7949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 7959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 7969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 7989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 7999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 8009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 8019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 8039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 8049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 8059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 8069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 8079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 8089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 8099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 8119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 8129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 8139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 8149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 816c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang b = request->input_buffer; 817c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel *channel = 818c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 819c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (channel == NULL) { 820c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 821c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 822c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 823c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 824c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 825c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 826c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 827c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 828c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 829c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->release_fence != -1) { 830c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 831c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 832c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 833c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 834c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->buffer == NULL) { 835c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 836c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 837c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 838c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 8399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 8419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 8429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 8439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 8449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 8459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 8469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 8479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 8489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 8499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 8509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 8529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 8539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 8549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 8559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 8579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 8589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 8599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 8609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 8629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 8639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 8649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 8659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 8679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 8689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 8699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 870e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 87462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION : deriveMinFrameDuration 87562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 87662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: derive mininum processed, jpeg, and raw frame durations based 87762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * on currently configured streams. 87862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 87962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : NONE 88062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 88162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN : NONE 88262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 88362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/ 88462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangvoid QCamera3HardwareInterface::deriveMinFrameDuration() 88562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{ 88662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t maxJpegDimension, maxProcessedDimension; 88762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 88862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxJpegDimension = 0; 88962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = 0; 89062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 89162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang // Figure out maximum jpeg, processed, and raw dimensions 89262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (List<stream_info_t*>::iterator it = mStreamInfo.begin(); 89362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang it != mStreamInfo.end(); it++) { 89462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 89562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang // Input stream doesn't have valid stream_type 89662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if ((*it)->stream->stream_type == CAMERA3_STREAM_INPUT) 89762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang continue; 89862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 89962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t dimension = (*it)->stream->width * (*it)->stream->height; 90062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if ((*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) { 90162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (dimension > maxJpegDimension) 90262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxJpegDimension = dimension; 90362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } else if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_SENSOR) { 90462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (dimension > maxProcessedDimension) 90562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = dimension; 90662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 90762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 90862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 90962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Assume all jpeg dimensions are in processed dimensions. 91062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (maxJpegDimension > maxProcessedDimension) 91162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = maxJpegDimension; 91262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 91362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Find minimum durations for processed, jpeg, and raw 91462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinRawFrameDuration = gCamCapability[mCameraId]->raw_min_duration; 91562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 91662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (maxProcessedDimension == 91762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang gCamCapability[mCameraId]->picture_sizes_tbl[i].width * 91862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang gCamCapability[mCameraId]->picture_sizes_tbl[i].height) { 91962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinProcessedFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i]; 92062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinJpegFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i]; 92162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang break; 92262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 92362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 92462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang} 92562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 92662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*=========================================================================== 92762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION : getMinFrameDuration 92862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 92962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: get minimum frame draution based on the current maximum frame durations 93062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * and current request configuration. 93162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 93262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : @request: requset sent by the frameworks 93362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 93462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN : min farme duration for a particular request 93562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 93662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/ 93762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint64_t QCamera3HardwareInterface::getMinFrameDuration(const camera3_capture_request_t *request) 93862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{ 93962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang bool hasJpegStream = false; 94062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (uint32_t i = 0; i < request->num_output_buffers; i ++) { 94162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang const camera3_stream_t *stream = request->output_buffers[i].stream; 94262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (stream->format == HAL_PIXEL_FORMAT_BLOB) 94362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang hasJpegStream = true; 94462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 94562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 94662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (!hasJpegStream) 94762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return MAX(mMinRawFrameDuration, mMinProcessedFrameDuration); 94862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang else 94962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return MAX(MAX(mMinRawFrameDuration, mMinProcessedFrameDuration), mMinJpegFrameDuration); 95062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang} 95162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 95262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*=========================================================================== 953cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * FUNCTION : handleMetadataWithLock 954cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 955cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * DESCRIPTION: Handles metadata buffer callback with mMutex lock held. 956cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 957cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * PARAMETERS : @metadata_buf: metadata buffer 958cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 959cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * RETURN : 960cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 961cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *==========================================================================*/ 962cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wangvoid QCamera3HardwareInterface::handleMetadataWithLock( 963cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mm_camera_super_buf_t *metadata_buf) 964cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang{ 965cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer; 966cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang int32_t frame_number_valid = *(int32_t *) 967cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata); 968cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang uint32_t pending_requests = *(uint32_t *)POINTER_OF( 969cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang CAM_INTF_META_PENDING_REQUESTS, metadata); 970cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang uint32_t frame_number = *(uint32_t *) 971cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata); 972cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang const struct timeval *tv = (const struct timeval *) 973cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata); 974cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC + 975cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang tv->tv_usec * NSEC_PER_USEC; 976cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang cam_frame_dropped_t cam_frame_drop = *(cam_frame_dropped_t *) 977cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_DROPPED, metadata); 978cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 979cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (!frame_number_valid) { 980cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: Not a valid frame number, used as SOF only", __func__); 981cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mMetadataChannel->bufDone(metadata_buf); 982cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang free(metadata_buf); 983cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang goto done_metadata; 984cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 985cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__, 986cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang frame_number, capture_time); 987cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 988cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // Go through the pending requests info and send shutter/results to frameworks 989cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 990cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang i != mPendingRequestsList.end() && i->frame_number <= frame_number;) { 991cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang camera3_capture_result_t result; 992cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang camera3_notify_msg_t notify_msg; 993cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number); 994cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 995cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // Flush out all entries with less or equal frame numbers. 996cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 997cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang //TODO: Make sure shutter timestamp really reflects shutter timestamp. 998cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang //Right now it's the same as metadata timestamp 999cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 1000cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang //TODO: When there is metadata drop, how do we derive the timestamp of 1001cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang //dropped frames? For now, we fake the dropped timestamp by substracting 1002cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang //from the reported timestamp 1003cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang nsecs_t current_capture_time = capture_time - 1004cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang (frame_number - i->frame_number) * NSEC_PER_33MSEC; 1005cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 1006cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // Send shutter notify to frameworks 1007cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang notify_msg.type = CAMERA3_MSG_SHUTTER; 1008cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang notify_msg.message.shutter.frame_number = i->frame_number; 1009cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang notify_msg.message.shutter.timestamp = current_capture_time; 1010cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1011cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__, 1012cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang i->frame_number, capture_time); 1013f060ebe7f00ea62a029df01482e32b1d57c3efe6Mansoor Aftab mPendingRequest--; 1014cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 1015cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // Check whether any stream buffer corresponding to this is dropped or not 1016cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // If dropped, then send the ERROR_BUFFER for the corresponding stream 1017cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (cam_frame_drop.frame_dropped) { 1018cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang camera3_notify_msg_t notify_msg; 1019cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1020cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang j != i->buffers.end(); j++) { 1021cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)j->stream->priv; 1022cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang uint32_t streamTypeMask = channel->getStreamTypeMask(); 1023cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (streamTypeMask & cam_frame_drop.stream_type_mask) { 1024cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // Send Error notify to frameworks with CAMERA3_MSG_ERROR_BUFFER 1025cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: Start of reporting error frame#=%d, streamMask=%d", 1026cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang __func__, i->frame_number, streamTypeMask); 1027cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang notify_msg.type = CAMERA3_MSG_ERROR; 1028cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang notify_msg.message.error.frame_number = i->frame_number; 1029cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang notify_msg.message.error.error_code = CAMERA3_MSG_ERROR_BUFFER ; 1030cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang notify_msg.message.error.error_stream = j->stream; 1031cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1032cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: End of reporting error frame#=%d, streamMask=%d", 1033cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang __func__, i->frame_number, streamTypeMask); 1034cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang PendingFrameDropInfo PendingFrameDrop; 1035cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang PendingFrameDrop.frame_number=i->frame_number; 1036cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang PendingFrameDrop.stream_type_mask = cam_frame_drop.stream_type_mask; 1037cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // Add the Frame drop info to mPendingFrameDropList 1038cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mPendingFrameDropList.push_back(PendingFrameDrop); 1039cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1040cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1041cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1042cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 1043cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // Send empty metadata with already filled buffers for dropped metadata 1044cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // and send valid metadata with already filled buffers for current metadata 1045cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (i->frame_number < frame_number) { 1046cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang CameraMetadata dummyMetadata; 1047cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP, 1048cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ¤t_capture_time, 1); 1049cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang dummyMetadata.update(ANDROID_REQUEST_ID, 1050cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang &(i->request_id), 1); 1051cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result.result = dummyMetadata.release(); 1052cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } else { 1053cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result.result = translateCbMetadataToResultMetadata(metadata, 1054cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang current_capture_time, i->request_id, i->blob_request, 1055cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang &(i->input_jpeg_settings)); 1056cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (mIsZslMode) { 1057cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang int found_metadata = 0; 1058cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang //for ZSL case store the metadata buffer and corresp. ZSL handle ptr 1059cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1060cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang j != i->buffers.end(); j++) { 1061cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (j->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1062cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang //check if corresp. zsl already exists in the stored metadata list 1063cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1064cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang m != mStoredMetadataList.begin(); m++) { 1065cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (m->frame_number == frame_number) { 1066cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang m->meta_buf = metadata_buf; 1067cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang found_metadata = 1; 1068cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang break; 1069cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1070cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1071cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (!found_metadata) { 1072cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang MetadataBufferInfo store_meta_info; 1073cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang store_meta_info.meta_buf = metadata_buf; 1074cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang store_meta_info.frame_number = frame_number; 1075cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mStoredMetadataList.push_back(store_meta_info); 1076cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang found_metadata = 1; 1077cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1078cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1079cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1080cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (!found_metadata) { 1081cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (!i->input_buffer_present && i->blob_request) { 1082cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang //livesnapshot or fallback non-zsl snapshot case 1083cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1084cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang j != i->buffers.end(); j++){ 1085cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (j->stream->stream_type == CAMERA3_STREAM_OUTPUT && 1086cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang j->stream->format == HAL_PIXEL_FORMAT_BLOB) { 1087cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true); 1088cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang break; 1089cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1090cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1091cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } else { 1092cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang //return the metadata immediately 1093cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mMetadataChannel->bufDone(metadata_buf); 1094cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang free(metadata_buf); 1095cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1096cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1097cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } else if (!mIsZslMode && i->blob_request) { 1098cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang //If it is a blob request then send the metadata to the picture channel 1099cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true); 1100cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } else { 1101cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // Return metadata buffer 1102cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mMetadataChannel->bufDone(metadata_buf); 1103cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang free(metadata_buf); 1104cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1105cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1106cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (!result.result) { 1107cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGE("%s: metadata is NULL", __func__); 1108cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1109cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result.frame_number = i->frame_number; 1110cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result.num_output_buffers = 0; 1111cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result.output_buffers = NULL; 1112cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1113cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang j != i->buffers.end(); j++) { 1114cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (j->buffer) { 1115cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result.num_output_buffers++; 1116cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1117cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1118cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 1119cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (result.num_output_buffers > 0) { 1120cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang camera3_stream_buffer_t *result_buffers = 1121cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang new camera3_stream_buffer_t[result.num_output_buffers]; 1122cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (!result_buffers) { 1123cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGE("%s: Fatal error: out of memory", __func__); 1124cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1125cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang size_t result_buffers_idx = 0; 1126cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1127cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang j != i->buffers.end(); j++) { 1128cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (j->buffer) { 1129cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<PendingFrameDropInfo>::iterator m = mPendingFrameDropList.begin(); 1130cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang m != mPendingFrameDropList.end(); m++) { 1131cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)j->buffer->stream->priv; 1132cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang uint32_t streamTypeMask = channel->getStreamTypeMask(); 1133cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if((m->stream_type_mask & streamTypeMask) && 1134cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang (m->frame_number==frame_number)) { 1135cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang j->buffer->status=CAMERA3_BUFFER_STATUS_ERROR; 1136cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: Stream STATUS_ERROR frame_number=%d, streamTypeMask=%d", 1137cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang __func__, frame_number, streamTypeMask); 1138cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang m = mPendingFrameDropList.erase(m); 1139cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang break; 1140cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1141cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1142cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result_buffers[result_buffers_idx++] = *(j->buffer); 1143cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang free(j->buffer); 1144cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang j->buffer = NULL; 1145cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mPendingBuffersMap.editValueFor(j->stream)--; 1146cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1147cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1148cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result.output_buffers = result_buffers; 1149cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 1150cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 1151cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: meta frame_number = %d, capture_time = %lld", 1152cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang __func__, result.frame_number, current_capture_time); 1153cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang free_camera_metadata((camera_metadata_t *)result.result); 1154cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang delete[] result_buffers; 1155cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } else { 1156cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 1157cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: meta frame_number = %d, capture_time = %lld", 1158cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang __func__, result.frame_number, current_capture_time); 1159cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang free_camera_metadata((camera_metadata_t *)result.result); 1160cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1161cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // erase the element from the list 1162cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang i = mPendingRequestsList.erase(i); 1163cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1164cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 1165cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wangdone_metadata: 1166cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (!pending_requests) 1167cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang unblockRequestIfNecessary(); 1168cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 1169cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang} 1170cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 1171cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang/*=========================================================================== 1172cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * FUNCTION : handleBufferWithLock 1173cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 1174cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * DESCRIPTION: Handles image buffer callback with mMutex lock held. 1175cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 1176cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * PARAMETERS : @buffer: image buffer for the callback 1177cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * @frame_number: frame number of the image buffer 1178cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 1179cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * RETURN : 1180cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 1181cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *==========================================================================*/ 1182cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wangvoid QCamera3HardwareInterface::handleBufferWithLock( 1183cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 1184cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang{ 1185cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // If the frame number doesn't exist in the pending request list, 1186cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // directly send the buffer to the frameworks, and update pending buffers map 1187cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // Otherwise, book-keep the buffer. 1188cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1189cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang while (i != mPendingRequestsList.end() && i->frame_number != frame_number){ 1190cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang i++; 1191cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1192cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (i == mPendingRequestsList.end()) { 1193cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // Verify all pending requests frame_numbers are greater 1194cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin(); 1195cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang j != mPendingRequestsList.end(); j++) { 1196cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (j->frame_number < frame_number) { 1197cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGE("%s: Error: pending frame number %d is smaller than %d", 1198cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang __func__, j->frame_number, frame_number); 1199cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1200cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1201cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang camera3_capture_result_t result; 1202cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result.result = NULL; 1203cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result.frame_number = frame_number; 1204cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result.num_output_buffers = 1; 1205cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<PendingFrameDropInfo>::iterator m = mPendingFrameDropList.begin(); 1206cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang m != mPendingFrameDropList.end(); m++) { 1207cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)buffer->stream->priv; 1208cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang uint32_t streamTypeMask = channel->getStreamTypeMask(); 1209cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if((m->stream_type_mask & streamTypeMask) && 1210cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang (m->frame_number==frame_number) ) { 1211cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang buffer->status=CAMERA3_BUFFER_STATUS_ERROR; 1212cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: Stream STATUS_ERROR frame_number=%d, streamTypeMask=%d", 1213cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang __func__, frame_number, streamTypeMask); 1214cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang m = mPendingFrameDropList.erase(m); 1215cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang break; 1216cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1217cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1218cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang result.output_buffers = buffer; 1219cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: result frame_number = %d, buffer = %p", 1220cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang __func__, frame_number, buffer); 1221cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mPendingBuffersMap.editValueFor(buffer->stream)--; 1222cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (buffer->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1223cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang int found = 0; 1224cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<MetadataBufferInfo>::iterator k = mStoredMetadataList.begin(); 1225cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang k != mStoredMetadataList.end(); k++) { 1226cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (k->frame_number == frame_number) { 1227cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang k->zsl_buf_hdl = buffer->buffer; 1228cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang found = 1; 1229cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang break; 1230cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1231cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1232cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (!found) { 1233cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang MetadataBufferInfo meta_info; 1234cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang meta_info.frame_number = frame_number; 1235cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang meta_info.zsl_buf_hdl = buffer->buffer; 1236cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mStoredMetadataList.push_back(meta_info); 1237cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1238cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1239cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 1240cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } else { 1241cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1242cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang j != i->buffers.end(); j++) { 1243cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (j->stream == buffer->stream) { 1244cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (j->buffer != NULL) { 1245cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGE("%s: Error: buffer is already set", __func__); 1246cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } else { 1247cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang j->buffer = (camera3_stream_buffer_t *)malloc( 1248cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang sizeof(camera3_stream_buffer_t)); 1249cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *(j->buffer) = *buffer; 1250cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang ALOGV("%s: cache buffer %p at result frame_number %d", 1251cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang __func__, buffer, frame_number); 1252cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1253cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1254cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1255cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1256cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang} 1257cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 1258cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang/*=========================================================================== 1259cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * FUNCTION : unblockRequestIfNecessary 1260cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 1261cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * DESCRIPTION: Unblock capture_request if max_buffer hasn't been reached. Note 1262cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * that mMutex is held when this function is called. 1263cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 1264cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * PARAMETERS : 1265cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 1266cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * RETURN : 1267cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang * 1268cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang *==========================================================================*/ 1269cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wangvoid QCamera3HardwareInterface::unblockRequestIfNecessary() 1270cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang{ 1271cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang bool max_buffers_dequeued = false; 1272cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang for (size_t i = 0; i < mPendingBuffersMap.size(); i++) { 1273cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i); 1274cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang uint32_t queued_buffers = mPendingBuffersMap.valueAt(i); 1275cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (queued_buffers == stream->max_buffers) { 1276cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang max_buffers_dequeued = true; 1277cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang break; 1278cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1279cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1280cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (!max_buffers_dequeued) { 1281cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang // Unblock process_capture_request 1282cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang pthread_cond_signal(&mRequestCond); 1283cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang } 1284cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang} 1285cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang 1286cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang/*=========================================================================== 1287e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : registerStreamBuffers 1288e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1289e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 1290e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1291e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1292e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @stream_list : streams to be configured 1293e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1294e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1295e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1296e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1297e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 1298e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 1299e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1300e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = 0; 1301e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1302e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1303e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1304e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set == NULL) { 1305e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 1306e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1307e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 1308e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1309e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->stream == NULL) { 1310e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 1311e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1312e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 1313e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1314e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->num_buffers < 1) { 1315e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 1316e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1317e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 1318e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1319e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->buffers == NULL) { 1320e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 1321e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1322e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 1323e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1324e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1325e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 1326e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 1327e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 13280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //set the buffer_set in the mStreamInfo array 13291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 13301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 13311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->stream == stream) { 13320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint32_t numBuffers = buffer_set->num_buffers; 13331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.stream = buffer_set->stream; 13341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.num_buffers = numBuffers; 13351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers]; 13361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->buffer_set.buffers == NULL) { 13370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Failed to allocate buffer_handle_t*", __func__); 13380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_unlock(&mMutex); 13390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole return -ENOMEM; 13400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 13410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (size_t j = 0; j < numBuffers; j++){ 13421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers[j] = buffer_set->buffers[j]; 13430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 13441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->registered = 1; 13450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 13460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1347e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 1348e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 1349e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 1350e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1351e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENODEV; 1352e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1353e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1354e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1355e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 1356e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1357e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1358e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1359e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : processCaptureRequest 1360e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1361e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service 1362e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1363e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1364e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @request : request from framework to process 1365e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1366e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1367e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1368e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1369e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 1370e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_request_t *request) 1371e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1372e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = NO_ERROR; 137374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id; 1374e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata meta; 1375d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo reproc_meta; 1376d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int queueMetadata = 0; 1377e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1378e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1379e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 13802123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang rc = validateCaptureRequest(request); 13812123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang if (rc != NO_ERROR) { 13822123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang ALOGE("%s: incoming request is not valid", __func__); 13832123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang pthread_mutex_unlock(&mMutex); 13842123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang return rc; 13852123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang } 13862123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 13872123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang meta = request->settings; 13882123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 13892123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang // For first capture request, send capture intent, and 13902123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang // stream on all streams 1391d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang if (mFirstRequest) { 13922123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 13932123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 13942123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang int32_t hal_version = CAM_HAL_V3; 13952123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang uint8_t captureIntent = 13962123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 13972123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 13982123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 13992123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 14002123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 14012123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang sizeof(hal_version), &hal_version); 14022123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 14032123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang sizeof(captureIntent), &captureIntent); 14042123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, 14052123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mParameters); 14062123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang } 14072123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 140862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang mMetadataChannel->start(); 1409d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 1410d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang it != mStreamInfo.end(); it++) { 1411d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 1412d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang channel->start(); 1413d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang } 1414d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang } 1415d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang 1416e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frameNumber = request->frame_number; 141734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy uint32_t streamTypeMask = 0; 14189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 141974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab if (meta.exists(ANDROID_REQUEST_ID)) { 142074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0]; 142174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = request_id; 1422013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Received request with id: %d",__func__, request_id); 142374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else if (mFirstRequest || mCurrentRequestId == -1){ 142474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab ALOGE("%s: Unable to find request id field, \ 142574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab & no previous id available", __func__); 142674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab return NAME_NOT_FOUND; 142774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else { 1428013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Re-using old request id", __func__); 142974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = mCurrentRequestId; 143074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } 143174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 1432ba7843eb48941909a360512af9d0596790d7d887Iliyan Malchev ALOGV("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d", 1433c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, __LINE__, 1434c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->num_output_buffers, 1435c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer, 1436c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang frameNumber); 1437e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // Acquire all request buffers first 14387ee407aa1024789089aad411c372c79423699976Ajay Dudani int blob_request = 0; 1439e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 1440e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 144134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 1442e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang sp<Fence> acquireFence = new Fence(output.acquire_fence); 144366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 144466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 144566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Call function to store local copy of jpeg data for encode params. 14467ee407aa1024789089aad411c372c79423699976Ajay Dudani blob_request = 1; 144766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = getJpegSettings(request->settings); 144866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (rc < 0) { 14490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: failed to get jpeg parameters", __func__); 145066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pthread_mutex_unlock(&mMutex); 145166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 145266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 145366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 145466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1455e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 1456e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != OK) { 1457e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: fence wait failed %d", __func__, rc); 1458e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1459e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 1460e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 146134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy streamTypeMask |= channel->getStreamTypeMask(); 146234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy } 146334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy 146462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = setFrameParameters(request, streamTypeMask); 146534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy if (rc < 0) { 146634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy ALOGE("%s: fail to set frame parameters", __func__); 146734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy pthread_mutex_unlock(&mMutex); 146834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy return rc; 1469e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1470e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 14711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Update pending request list and pending buffers map */ 14721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole PendingRequestInfo pendingRequest; 14731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.frame_number = frameNumber; 14741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.num_buffers = request->num_output_buffers; 147574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab pendingRequest.request_id = request_id; 14767ee407aa1024789089aad411c372c79423699976Ajay Dudani pendingRequest.blob_request = blob_request; 147717c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab if (blob_request) 147817c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab pendingRequest.input_jpeg_settings = *mJpegSettings; 147913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab pendingRequest.input_buffer_present = (request->input_buffer != NULL)? 1 : 0; 148074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 14811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < request->num_output_buffers; i++) { 14821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole RequestedBufferInfo requestedBuf; 14831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.stream = request->output_buffers[i].stream; 14841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.buffer = NULL; 14851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.buffers.push_back(requestedBuf); 14861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 14871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(requestedBuf.stream)++; 14881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.push_back(pendingRequest); 14901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 14919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 1492e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMetadataChannel->request(NULL, frameNumber); 14939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 14949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 14959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 14969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 14979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 1498c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mm_camera_buf_def_t *pInputBuffer = NULL; 149966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 15009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 15019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 15029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 15039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 15049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 150566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 1506c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3RegularChannel* inputChannel = NULL; 1507c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(request->input_buffer != NULL){ 1508c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang //Try to get the internal format 1509c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel = (QCamera3RegularChannel*) 1510c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->stream->priv; 1511c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(inputChannel == NULL ){ 1512c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: failed to get input channel handle", __func__); 1513c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else { 1514c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer = 1515c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel->getInternalFormatBuffer( 1516c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->buffer); 1517c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("%s: Input buffer dump",__func__); 1518c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("Stream id: %d", pInputBuffer->stream_id); 1519c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("streamtype:%d", pInputBuffer->stream_type); 1520c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("frame len:%d", pInputBuffer->frame_len); 152141da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab ALOGD("Handle:%p", request->input_buffer->buffer); 1522d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //TODO: need to get corresponding metadata and send it to pproc 1523d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1524d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 1525d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->zsl_buf_hdl == request->input_buffer->buffer) { 1526d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab reproc_meta.meta_buf = m->meta_buf; 1527d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab queueMetadata = 1; 1528d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1529d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1530d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1531c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1532c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1533c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang rc = channel->request(output.buffer, frameNumber, mJpegSettings, 1534c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer,(QCamera3Channel*)inputChannel); 1535d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (queueMetadata) { 153641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(reproc_meta.meta_buf,mMetadataChannel,false); 1537d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 153866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 1539ba7843eb48941909a360512af9d0596790d7d887Iliyan Malchev ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__, 1540a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab __LINE__, output.buffer, frameNumber); 1541d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (mIsZslMode && output.stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1542d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1543d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 1544d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (uint32_t j = 0; j < request->num_output_buffers; j++) { 1545d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->zsl_buf_hdl == request->output_buffers[j].buffer) { 1546d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 1547d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 1548d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 1549d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1550d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1551d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1552d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1553d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 155466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = channel->request(output.buffer, frameNumber); 155566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 15569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 15579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 15589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 15599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 15601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mFirstRequest = false; 15619770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab // Added a timed condition wait 15629770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab struct timespec ts; 15639770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab uint8_t isValidTimeout = 1; 15649770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab rc = clock_gettime(CLOCK_REALTIME, &ts); 15659770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab if (rc < 0) { 15669770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab isValidTimeout = 0; 15679770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ALOGE("%s: Error reading the real time clock!!", __func__); 15689770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab } 15699770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab else { 15709770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab // Make timeout as 5 sec for request to be honored 15719770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ts.tv_sec += 5; 15729770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab } 15739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 1574f060ebe7f00ea62a029df01482e32b1d57c3efe6Mansoor Aftab mPendingRequest++; 1575f060ebe7f00ea62a029df01482e32b1d57c3efe6Mansoor Aftab do { 15769770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab if (!isValidTimeout) { 15779770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ALOGV("%s: Blocking on conditional wait", __func__); 15789770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab pthread_cond_wait(&mRequestCond, &mMutex); 15799770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab } 15809770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab else { 15819770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ALOGV("%s: Blocking on timed conditional wait", __func__); 15829770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab rc = pthread_cond_timedwait(&mRequestCond, &mMutex, &ts); 15839770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab if (rc == ETIMEDOUT) { 15849770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab rc = -ENODEV; 15859770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ALOGE("%s: Unblocked on timeout!!!!", __func__); 15869770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab break; 15879770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab } 15889770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab } 15899770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ALOGV("%s: Unblocked", __func__); 1590f060ebe7f00ea62a029df01482e32b1d57c3efe6Mansoor Aftab }while (mPendingRequest >= kMaxInFlight); 15919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1592e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 15931fca7d2974d2adb729b13ad51600e0b8d8478e48Shuzhen Wang 159480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 159580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 159680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 15979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 1598e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : getMetadataVendorTagOps 15999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 1600e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 16019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 16029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 1603e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1604e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1605e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1606e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1607b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps( 1608b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang vendor_tag_query_ops_t* /*ops*/) 1609e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1610e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Enable locks when we eventually add Vendor Tags */ 1611e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 1612e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1613e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1614e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1615e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 1616e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1617e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1618e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1619e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1620e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : dump 1621e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1622e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 1623e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1624e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1625e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1626e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1627e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1628e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1629b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/) 1630e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1631e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /*Enable lock when we implement this function*/ 1632e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 1633e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1634e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1635e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1636e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 1637e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1638e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1639e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1640c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*=========================================================================== 1641c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION : flush 1642c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1643c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION: 1644c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1645c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS : 1646c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1647c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1648c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN : 1649c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/ 1650c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush() 1651c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{ 1652c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /*Enable lock when we implement this function*/ 1653c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /* 1654c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang pthread_mutex_lock(&mMutex); 1655c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 1656c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang pthread_mutex_unlock(&mMutex); 1657c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang */ 1658c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return 0; 1659c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang} 16607ee407aa1024789089aad411c372c79423699976Ajay Dudani 1661e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1662e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 1663e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 166433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result 166533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * (streams, as well as metadata) 1666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @metadata : metadata information 166933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. 167033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * NULL if metadata. 16719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 16729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 16739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 16741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf, 1675e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 16769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 16775b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_lock(&mMutex); 1678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1679cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang if (metadata_buf) 1680cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang handleMetadataWithLock(metadata_buf); 1681cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang else 1682cc7a1db9ae6ca4ffcaf16d478247489bf40d1caeShuzhen Wang handleBufferWithLock(buffer, frame_number); 168333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 16845b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_unlock(&mMutex); 16859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 16869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 16879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 168897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 168997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : translateCbMetadataToResultMetadata 169097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 169197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: 169297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 169397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 169497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @metadata : metadata information from callback 169597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 169697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN : camera_metadata_t* 169797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * metadata in a format specified by fwk 169897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 169997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* 170097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata 170174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab (metadata_buffer_t *metadata, nsecs_t timestamp, 170217c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab int32_t request_id, int32_t BlobRequest, 170317c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab jpeg_settings_t* inputjpegsettings) 170497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 170597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata camMetadata; 170697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camera_metadata_t* resultMetadata; 170797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 17080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); 170974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1); 171097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 171117c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab // Update the JPEG related info 171217c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab if (BlobRequest) { 171317c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab camMetadata.update(ANDROID_JPEG_ORIENTATION, &(inputjpegsettings->jpeg_orientation), 1); 171417c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab camMetadata.update(ANDROID_JPEG_QUALITY, &(inputjpegsettings->jpeg_quality), 1); 171517c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab 171617c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab int32_t thumbnailSizeTable[2]; 171717c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab thumbnailSizeTable[0] = inputjpegsettings->thumbnail_size.width; 171817c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab thumbnailSizeTable[1] = inputjpegsettings->thumbnail_size.height; 171917c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab camMetadata.update(ANDROID_JPEG_THUMBNAIL_SIZE, thumbnailSizeTable, 2); 172017c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab ALOGV("%s: Orien=%d, quality=%d wid=%d, height=%d", __func__, inputjpegsettings->jpeg_orientation, 172117c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab inputjpegsettings->jpeg_quality,thumbnailSizeTable[0], thumbnailSizeTable[1]); 172217c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab 172317c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab if (inputjpegsettings->gps_coordinates[0]) { 172417c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab double gpsCoordinates[3]; 172517c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab gpsCoordinates[0]=*(inputjpegsettings->gps_coordinates[0]); 172617c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab gpsCoordinates[1]=*(inputjpegsettings->gps_coordinates[1]); 172717c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab gpsCoordinates[2]=*(inputjpegsettings->gps_coordinates[2]); 172817c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab camMetadata.update(ANDROID_JPEG_GPS_COORDINATES, gpsCoordinates, 3); 172917c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab ALOGV("%s: gpsCoordinates[0]=%f, 1=%f 2=%f", __func__, gpsCoordinates[0], 173017c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab gpsCoordinates[1],gpsCoordinates[2]); 173117c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab } 173217c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab 173317c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab if (inputjpegsettings->gps_timestamp) { 173417c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab camMetadata.update(ANDROID_JPEG_GPS_TIMESTAMP, inputjpegsettings->gps_timestamp, 1); 173517c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab ALOGV("%s: gps_timestamp=%lld", __func__, *(inputjpegsettings->gps_timestamp)); 173617c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab } 173717c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab 173817c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab String8 str(inputjpegsettings->gps_processing_method); 173917c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab if (strlen(mJpegSettings->gps_processing_method) > 0) { 174017c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab camMetadata.update(ANDROID_JPEG_GPS_PROCESSING_METHOD, str); 174117c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab } 174217c34c93d837a49f778ed0294c3670a30f10396eMansoor Aftab } 17433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t curr_entry = GET_FIRST_PARAM_ID(metadata); 17443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t next_entry; 17453e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang while (curr_entry != CAM_INTF_PARM_MAX) { 17463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang switch (curr_entry) { 17473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_FACE_DETECTION:{ 17483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_face_detection_data_t *faceDetectionInfo = 17493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (cam_face_detection_data_t *)POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata); 17503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t numFaces = faceDetectionInfo->num_faces_detected; 1751514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang int32_t faceIds[MAX_ROI]; 1752514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang uint8_t faceScores[MAX_ROI]; 1753514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang int32_t faceRectangles[MAX_ROI * 4]; 1754514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang int32_t faceLandmarks[MAX_ROI * 6]; 17553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int j = 0, k = 0; 17563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang for (int i = 0; i < numFaces; i++) { 17573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang faceIds[i] = faceDetectionInfo->faces[i].face_id; 17583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang faceScores[i] = faceDetectionInfo->faces[i].score; 17593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang convertToRegions(faceDetectionInfo->faces[i].face_boundary, 17603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang faceRectangles+j, -1); 17613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k); 17623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang j+= 4; 17633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang k+= 6; 17643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 1765514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang 1766514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang if (numFaces <= 0) { 1767514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang memset(faceIds, 0, sizeof(int32_t) * MAX_ROI); 1768514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang memset(faceScores, 0, sizeof(uint8_t) * MAX_ROI); 1769514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang memset(faceRectangles, 0, sizeof(int32_t) * MAX_ROI * 4); 1770514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang memset(faceLandmarks, 0, sizeof(int32_t) * MAX_ROI * 6); 17713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 1772514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang 1773514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces); 1774514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces); 1775514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES, 1776514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang faceRectangles, numFaces*4); 1777514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS, 1778514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang faceLandmarks, numFaces*6); 1779514dd60f8bafe2248fc4200cd691632b1a9eab0fShuzhen Wang 17803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_COLOR_CORRECT_MODE:{ 17833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *color_correct_mode = 17843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata); 17853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1); 17863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AEC_PRECAPTURE_ID: { 17893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t *ae_precapture_id = 17903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata); 17913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1); 17923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AEC_ROI: { 17953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_area_t *hAeRegions = 17963e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata); 17973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t aeRegions[5]; 17983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight); 17993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5); 18003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AEC_STATE:{ 18033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *ae_state = 18043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata); 18053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1); 18063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_PARM_FOCUS_MODE:{ 18093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *focusMode = 18103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata); 1811867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang uint8_t fwkAfMode = lookupFwkName(FOCUS_MODES_MAP, 1812867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), *focusMode); 1813867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AF_MODE, &fwkAfMode, 1); 18143e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18153e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18163e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AF_ROI:{ 18173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang /*af regions*/ 18183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_area_t *hAfRegions = 18193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata); 18203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t afRegions[5]; 18213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight); 18223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5); 18233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18243e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AF_STATE: { 18263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata); 18273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1); 18283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18303e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AF_TRIGGER_ID: { 18313e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t *afTriggerId = 18323e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata); 18333e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1); 18343e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18353e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18363e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_PARM_WHITE_BALANCE: { 18373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *whiteBalance = 18383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata); 1839867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang uint8_t fwkWhiteBalanceMode = lookupFwkName(WHITE_BALANCE_MODES_MAP, 1840867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 1841867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang *whiteBalance); 1842867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AWB_MODE, &fwkWhiteBalanceMode, 1); 18433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18453e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AWB_REGIONS: { 18463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang /*awb regions*/ 18473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_area_t *hAwbRegions = 18483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata); 18493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t awbRegions[5]; 18503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight); 18513e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5); 18523e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AWB_STATE: { 18553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *whiteBalanceState = 18563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata); 18573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1); 18583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_MODE: { 18613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata); 18623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_MODE, mode, 1); 18633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_EDGE_MODE: { 18669bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab cam_edge_application_t *edgeApplication = 18679bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab (cam_edge_application_t *)POINTER_OF(CAM_INTF_META_EDGE_MODE, metadata); 18689bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab uint8_t edgeStrength = (uint8_t)edgeApplication->sharpness; 18699bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab camMetadata.update(ANDROID_EDGE_MODE, &(edgeApplication->edge_mode), 1); 18709bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab camMetadata.update(ANDROID_EDGE_STRENGTH, &edgeStrength, 1); 18713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_FLASH_POWER: { 18743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *flashPower = 18753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata); 18763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1); 18773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_FLASH_FIRING_TIME: { 18803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int64_t *flashFiringTime = 18813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata); 18823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1); 18833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_FLASH_STATE: { 18863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *flashState = 18873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata); 18883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_FLASH_STATE, flashState, 1); 18893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 1891d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang case CAM_INTF_META_FLASH_MODE:{ 1892d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang uint8_t *flashMode = (uint8_t*) 1893d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang POINTER_OF(CAM_INTF_META_FLASH_MODE, metadata); 1894d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang camMetadata.update(ANDROID_FLASH_MODE, flashMode, 1); 1895d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang break; 1896d3e9508eb0f78c4911f51d779b4e7f2c4eb6fcc7Shuzhen Wang } 18973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_HOTPIXEL_MODE: { 18983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *hotPixelMode = 18993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata); 19003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1); 19013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 19023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_APERTURE:{ 19043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang float *lensAperture = 19053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata); 19063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1); 19073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 19083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_FILTERDENSITY: { 19103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang float *filterDensity = 19113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata); 19123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1); 19133e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 19143e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19153e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_FOCAL_LENGTH:{ 19163e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang float *focalLength = 19173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata); 19183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1); 19193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 19203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_FOCUS_DISTANCE: { 19223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang float *focusDistance = 19233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata); 19243e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1); 19253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 19263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_FOCUS_RANGE: { 19283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang float *focusRange = 19293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata); 193032d9e5ad33dd580b6273aac830ef99f913a0ce0bAjay Dudani camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 2); 1931b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang break; 1932b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang } 1933b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang case CAM_INTF_META_LENS_STATE: { 1934b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang uint8_t *lensState = (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_STATE, metadata); 1935b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang camMetadata.update(ANDROID_LENS_STATE , lensState, 1); 1936b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang break; 19373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_OPT_STAB_MODE: { 19393e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *opticalStab = 19403e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata); 19413e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1); 1942b7cf952e7ee594c39c377b17f83f4524d9cd1e52Shuzhen Wang break; 19433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_NOISE_REDUCTION_MODE: { 19453e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *noiseRedMode = 19463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata); 19473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1); 19483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 19493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19509bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab case CAM_INTF_META_NOISE_REDUCTION_STRENGTH: { 19519bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab uint8_t *noiseRedStrength = 19529bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_STRENGTH, metadata); 19539bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab camMetadata.update(ANDROID_NOISE_REDUCTION_STRENGTH, noiseRedStrength, 1); 19549bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab break; 19559bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab } 19563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SCALER_CROP_REGION: { 19573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_crop_region_t *hScalerCropRegion =(cam_crop_region_t *) 19583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata); 19593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t scalerCropRegion[4]; 19603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang scalerCropRegion[0] = hScalerCropRegion->left; 19613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang scalerCropRegion[1] = hScalerCropRegion->top; 19623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang scalerCropRegion[2] = hScalerCropRegion->width; 19633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang scalerCropRegion[3] = hScalerCropRegion->height; 19643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4); 19653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 19663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SENSOR_EXPOSURE_TIME:{ 19683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int64_t *sensorExpTime = 19693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata); 19703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang mMetadataResponse.exposure_time = *sensorExpTime; 19713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang ALOGV("%s: sensorExpTime = %lld", __func__, *sensorExpTime); 19723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1); 19733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 19743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SENSOR_FRAME_DURATION:{ 19763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int64_t *sensorFameDuration = 19773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata); 19783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang ALOGV("%s: sensorFameDuration = %lld", __func__, *sensorFameDuration); 19793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1); 19803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 19813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SENSOR_SENSITIVITY:{ 19833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t *sensorSensitivity = 19843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata); 19853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang ALOGV("%s: sensorSensitivity = %d", __func__, *sensorSensitivity); 19863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang mMetadataResponse.iso_speed = *sensorSensitivity; 19873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1); 19883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 19893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SHADING_MODE: { 19913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *shadingMode = 19923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata); 19933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1); 19943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 19953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 19963e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_STATS_FACEDETECT_MODE: { 19973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *faceDetectMode = 19983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata); 19993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t fwk_faceDetectMode = lookupFwkName(FACEDETECT_MODES_MAP, 20003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]), 20013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang *faceDetectMode); 20023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1); 20033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_STATS_HISTOGRAM_MODE: { 20063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *histogramMode = 20073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata); 20083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1); 20093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_STATS_SHARPNESS_MAP_MODE:{ 20123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *sharpnessMapMode = 20133e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata); 20143e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 20153e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang sharpnessMapMode, 1); 20163e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_STATS_SHARPNESS_MAP:{ 20193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_sharpness_map_t *sharpnessMap = (cam_sharpness_map_t *) 20203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata); 20213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP, 20223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int32_t*)sharpnessMap->sharpness, 20233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT); 20243e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_SHADING_MAP: { 20273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *) 20283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_LENS_SHADING_MAP, metadata); 20293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height; 20303e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int map_width = gCamCapability[mCameraId]->lens_shading_map_size.width; 20313e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP, 20323e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float*)lensShadingMap->lens_shading, 20333e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang 4*map_width*map_height); 20343e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20353e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20363e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_TONEMAP_CURVES:{ 20373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang //Populate CAM_INTF_META_TONEMAP_CURVES 20383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang /* ch0 = G, ch 1 = B, ch 2 = R*/ 20393e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_rgb_tonemap_curves *tonemap = (cam_rgb_tonemap_curves *) 20403e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_TONEMAP_CURVES, metadata); 20413e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_TONEMAP_CURVE_GREEN, 20423e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float*)tonemap->curves[0].tonemap_points, 20433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang tonemap->tonemap_points_cnt * 2); 20443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang 20453e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_TONEMAP_CURVE_BLUE, 20463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float*)tonemap->curves[1].tonemap_points, 20473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang tonemap->tonemap_points_cnt * 2); 20483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang 20493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_TONEMAP_CURVE_RED, 20503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float*)tonemap->curves[2].tonemap_points, 20513e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang tonemap->tonemap_points_cnt * 2); 20523e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_COLOR_CORRECT_GAINS:{ 20553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*) 20563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata); 20573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4); 20583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_COLOR_CORRECT_TRANSFORM:{ 20613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*) 20623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata); 20633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM, 2064d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3); 20653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_PRED_COLOR_CORRECT_GAINS:{ 20683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*) 20693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata); 20703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS, 2071d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy predColorCorrectionGains->gains, 4); 20723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM:{ 20753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*) 20763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata); 20773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM, 20783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3); 20793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang 20813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_BLACK_LEVEL_LOCK:{ 20833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *blackLevelLock = (uint8_t*) 20843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata); 20853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1); 20863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SCENE_FLICKER:{ 20893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *sceneFlicker = (uint8_t*) 20903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_SCENE_FLICKER, metadata); 20913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1); 20923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 20943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_PARM_LED_MODE: 20953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 20969bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab case CAM_INTF_PARM_EFFECT: { 20979bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab uint8_t *effectMode = (uint8_t*) 20989bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab POINTER_OF(CAM_INTF_PARM_EFFECT, metadata); 20999bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab uint8_t fwk_effectMode = lookupFwkName(EFFECT_MODES_MAP, 21009bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab sizeof(EFFECT_MODES_MAP), 21019bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab *effectMode); 21029bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab camMetadata.update(ANDROID_CONTROL_EFFECT_MODE, &fwk_effectMode, 1); 21039bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab break; 21049bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab } 21053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang default: 21063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang ALOGV("%s: This is not a valid metadata type to report to fwk, %d", 21073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang __func__, curr_entry); 21083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 21093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 21103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang next_entry = GET_NEXT_PARAM_ID(curr_entry, metadata); 21113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang curr_entry = next_entry; 21123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 211397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole resultMetadata = camMetadata.release(); 211433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return resultMetadata; 211597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 211697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 211797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 211859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertToRegions 211997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 212097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array 212197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 212297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 212397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @rect : cam_rect_t struct to convert 212497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @region : int32_t destination array 212597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @weight : if we are converting from cam_area_t, weight is valid 212697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * else weight = -1 212797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 212897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 212959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){ 213097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[0] = rect.left; 213197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[1] = rect.top; 213259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[2] = rect.left + rect.width; 213359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[3] = rect.top + rect.height; 213497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (weight > -1) { 213597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[4] = weight; 213697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 213797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 213859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 213959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*=========================================================================== 214059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertFromRegions 214159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 214259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t 214359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 214459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS : 214559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @rect : cam_rect_t struct to convert 214659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @region : int32_t destination array 214759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @weight : if we are converting from cam_area_t, weight is valid 214859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * else weight = -1 214959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 215059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/ 215159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi, 215259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang const camera_metadata_t *settings, 215359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang uint32_t tag){ 215459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang CameraMetadata frame_settings; 215559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang frame_settings = settings; 215659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_min = frame_settings.find(tag).data.i32[0]; 215759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_min = frame_settings.find(tag).data.i32[1]; 215859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_max = frame_settings.find(tag).data.i32[2]; 215959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_max = frame_settings.find(tag).data.i32[3]; 216059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->weight = frame_settings.find(tag).data.i32[4]; 216159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.left = x_min; 216259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.top = y_min; 216359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.width = x_max - x_min; 216459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.height = y_max - y_min; 216559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang} 216659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 216797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 216871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION : resetIfNeededROI 216971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 217071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler 217171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * crop region 217271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 217371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS : 217471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @roi : cam_area_t struct to resize 217571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @scalerCropRegion : cam_crop_region_t region to compare against 217671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 217771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 217871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/ 217971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi, 218071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang const cam_crop_region_t* scalerCropRegion) 218171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{ 218271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_x_max = roi->rect.width + roi->rect.left; 218371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_y_max = roi->rect.height + roi->rect.top; 2184f57748033ad578a1c790668e97ce64530004a3b6Mansoor Aftab int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->left; 2185f57748033ad578a1c790668e97ce64530004a3b6Mansoor Aftab int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->top; 218671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if ((roi_x_max < scalerCropRegion->left) || 218771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi_y_max < scalerCropRegion->top) || 218871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.left > crop_x_max) || 218971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.top > crop_y_max)){ 219071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return false; 219171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 219271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.left < scalerCropRegion->left) { 219371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.left = scalerCropRegion->left; 219471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 219571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.top < scalerCropRegion->top) { 219671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.top = scalerCropRegion->top; 219771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 219871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_x_max > crop_x_max) { 219971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_x_max = crop_x_max; 220071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 220171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_y_max > crop_y_max) { 220271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_y_max = crop_y_max; 220371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 220471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.width = roi_x_max - roi->rect.left; 220571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.height = roi_y_max - roi->rect.top; 220671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return true; 220771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang} 220871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang 220971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*=========================================================================== 221097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : convertLandmarks 221197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 221297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info 221397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 221497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 221597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @face : cam_rect_t struct to convert 221697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @landmarks : int32_t destination array 221797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 221897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 221997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 222097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks) 222197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 222297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[0] = face.left_eye_center.x; 222397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[1] = face.left_eye_center.y; 2224bb733216b5176a06b2db8f3ee165cb3a8d21babcShuzhen Wang landmarks[2] = face.right_eye_center.x; 222597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[3] = face.right_eye_center.y; 222697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[4] = face.mouth_center.x; 222797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[5] = face.mouth_center.y; 222897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 222997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 2230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 2231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 2233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 2235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 2241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 2242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 2244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 2246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 2247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 2248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 2250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 2251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 2252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 2253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 2254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2256e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 2257e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (capabilityHeap == NULL) { 2258e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: creation of capabilityHeap failed", __func__); 2259e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang goto heap_creation_failed; 2260e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 2261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 2262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 2263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 2264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 2265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 2266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 2269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 2270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 2271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 2272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 2273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 2274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 2275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 2276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 2277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 2280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 2281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 2282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 2283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 2284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 2286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 2287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 2288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 2289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 2291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 2292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 2293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 2295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 2296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 2297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 2298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 2299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 2300e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete capabilityHeap; 2301e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed: 2302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 2303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 2304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 2305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2309662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : initParameters 2310662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2311662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters 2312662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2313662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2316662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2318662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2319662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters() 2320662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2321662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 2322662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2323662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Allocate Set Param Buffer 2324662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = new QCamera3HeapMemory(); 2325662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 2326662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc != OK) { 2327662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = NO_MEMORY; 2328662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("Failed to allocate SETPARM Heap memory"); 2329662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 2330662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 2331662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 2332662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2333662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2334662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Map memory for parameters buffer 2335662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 2336662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole CAM_MAPPING_BUF_TYPE_PARM_BUF, 2337662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->getFd(0), 2338662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(parm_buffer_t)); 2339662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc < 0) { 2340662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:failed to map SETPARM buffer",__func__); 2341662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = FAILED_TRANSACTION; 2342662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->deallocate(); 2343662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 2344662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 2345662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 2346662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2347662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2348662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0); 2349662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 2350662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2351662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2352662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 235333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION : deinitParameters 235433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 235533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters 235633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 235733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS : 235833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 235933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN : NONE 236033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/ 236133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters() 236233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{ 236333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 236433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF); 236533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 236633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap->deallocate(); 236733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang delete mParamHeap; 236833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap = NULL; 236933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 237033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters = NULL; 237133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang} 237233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 237333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*=========================================================================== 23740a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION : calcMaxJpegSize 23750a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 23760a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId 23770a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 23780a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS : 23790a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 23800a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN : max_jpeg_size 23810a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/ 23820a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize() 23830a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{ 23840a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int32_t max_jpeg_size = 0; 23850a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int temp_width, temp_height; 23860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 23870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width; 23880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height; 23890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab if (temp_width * temp_height > max_jpeg_size ) { 23900a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = temp_width * temp_height; 23910a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 23920a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 23930a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 23940a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab return max_jpeg_size; 23950a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab} 23960a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab 23970a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*=========================================================================== 2398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 2399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 2401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 2407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 2408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 2410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 241297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata staticInfo; 2413c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 2414c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang /* android.info: hardware level */ 2415c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL; 2416c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, 2417c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &supportedHardwareLevel, 1); 2418c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 2419662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK; 2420662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 3 only*/ 24212dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 24222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); */ 24232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2424e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang /*hard coded for now but this should come from sensor*/ 2425e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang float min_focus_distance; 2426e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if(facingBack){ 2427e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 10; 2428e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2429e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 0; 2430e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 24322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &min_focus_distance, 1); 2433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 2435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 2436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2437c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*should be using focal lengths but sensor doesn't provide that info now*/ 2438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 2439c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &gCamCapability[cameraId]->focal_length, 2440c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1); 2441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 2443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 2444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 2445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 2447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 2448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 2449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 2452c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)gCamCapability[cameraId]->optical_stab_modes, 2453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 2454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 245580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 245680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 245780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 245880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 245947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 246080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 246180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 246280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 246380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 2464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 246547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 24660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->geo_correction_map_size.height}; 246780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 246880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 246980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 247080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 247180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 247280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 2473c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float)); 247480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 247580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 247680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 247780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 247880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 247980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 248080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 248180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 248280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 248380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 248465fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang camera_metadata_rational baseGainFactor = { 248565fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang gCamCapability[cameraId]->base_gain_factor.numerator, 248665fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang gCamCapability[cameraId]->base_gain_factor.denominator}; 248765fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang staticInfo.update(ANDROID_SENSOR_BASE_GAIN_FACTOR, 248865fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang &baseGainFactor, 1); 248980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 249080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 2491c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1); 249280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 249347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 249480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 249580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 249680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 249780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 249822817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t active_array_size[] = {0, 0, 249922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala gCamCapability[cameraId]->active_array_size.width, 250080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 250180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 250222817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala active_array_size, 4); 250380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 250480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 250580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 2506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 250780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 250880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 250980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 251080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 251180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 251280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 251380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 251480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 251580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 251680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 25176990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang (int*)&gCamCapability[cameraId]->max_num_roi, 1); 251880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 251980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 252080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 252180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 252280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 252380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 252480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 252547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 252680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 252780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 252880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 252980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 253080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 253180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 253280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 253380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 253480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 253580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 253680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 253780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 253880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 253922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888, 254022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB}; 254122817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t); 2542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 2543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats, 25448867984d33ed870071109a4500402dddbc85c048Shuzhen Wang scalar_formats_count); 2545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 254647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_processed_sizes[CAM_FORMAT_MAX * 2]; 254700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang makeTable(gCamCapability[cameraId]->picture_sizes_tbl, 254800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt, 2549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes); 2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes, 255200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2); 255300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 2554e936796df0426c326d043c2359c149024526f4bcShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, 255500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 255600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 25570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 255847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_fps_ranges[MAX_SIZES_CNT * 2]; 25590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl, 25600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->fps_ranges_tbl_cnt, 25610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole available_fps_ranges); 2562c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2563c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) ); 2564c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 256547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang camera_metadata_rational exposureCompensationStep = { 2566c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.numerator, 2567c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.denominator}; 2568c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 2569c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &exposureCompensationStep, 1); 2570c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2571c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*TO DO*/ 257247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF}; 2573c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 2574c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableVstabModes, sizeof(availableVstabModes)); 2575c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2576b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang /*HAL 1 and HAL 3 common*/ 25779443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab float maxZoom = 4; 2578c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 2579c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &maxZoom, 1); 2580c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 258147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max3aRegions = 1; 2582c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_MAX_REGIONS, 2583c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &max3aRegions, 1); 2584c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 258547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableFaceDetectModes[] = { 25866990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, 25876990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_FULL }; 2588c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 2589c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableFaceDetectModes, 2590c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(availableFaceDetectModes)); 2591c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 259247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 259380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 259480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 259580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 259680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 259780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 2598662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint8_t lensFacing = (facingBack) ? 259980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 260080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 2601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2602662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 260300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang available_processed_sizes, 2604c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2)); 2605c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2606c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 260708ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab available_thumbnail_sizes, 260808ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab sizeof(available_thumbnail_sizes)/sizeof(int32_t)); 2609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 261047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max_jpeg_size = 0; 261197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int temp_width, temp_height; 261297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 261397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width; 261497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height; 261597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (temp_width * temp_height > max_jpeg_size ) { 261697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = temp_width * temp_height; 261797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 261897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 261997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 262097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole staticInfo.update(ANDROID_JPEG_MAX_SIZE, 262197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole &max_jpeg_size, 1); 262297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 262347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_effects[CAM_EFFECT_MODE_MAX]; 26240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t size = 0; 2625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) { 26260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(EFFECT_MODES_MAP, 2627b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]), 26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_effects[i]); 26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_effects[size] = (uint8_t)val; 26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 2635662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_effects, 26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2637662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 263847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX]; 2639e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t supported_indexes[CAM_SCENE_MODE_MAX]; 26402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang int32_t supported_scene_modes_cnt = 0; 2641662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) { 26420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(SCENE_MODES_MAP, 2643b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 26440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_scene_modes[i]); 26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 2646e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val; 2647e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_indexes[supported_scene_modes_cnt] = i; 26482dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt++; 26490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2650662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2651e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2652662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 2653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_scene_modes, 26542dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt); 2655662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 265647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3]; 2657e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides, 2658e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt, 2659e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 26609443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supported_indexes, 26619443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab cameraId); 2662e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 2663e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 2664e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt*3); 2665e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 266647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX]; 26670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2668662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) { 26690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(ANTIBANDING_MODES_MAP, 2670b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 2671b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[cameraId]->supported_antibandings[i]); 26720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 26730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_antibanding_modes[size] = (uint8_t)val; 26740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 26750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2677662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2678662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 2679662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_antibanding_modes, 26800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2681662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 268247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX]; 26830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2684662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) { 26850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FOCUS_MODES_MAP, 2686b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 26870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_focus_modes[i]); 26880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 26890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_af_modes[size] = (uint8_t)val; 26900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 26910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2692662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2693662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 2694662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_af_modes, 26950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2696662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 269747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_awb_modes[CAM_WB_MODE_MAX]; 26980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2699662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) { 27000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP, 2701b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 27020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_white_balances[i]); 27030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 27040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_awb_modes[size] = (uint8_t)val; 27050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 27060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2707662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2708662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 2709662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_awb_modes, 27100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2712a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX]; 2713a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++) 2714a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i]; 2715a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava 2716a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava staticInfo.update(ANDROID_FLASH_FIRING_POWER, 2717a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava available_flash_levels, 2718a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava gCamCapability[cameraId]->supported_flash_firing_level_cnt); 2719a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava 2720662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 272100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang uint8_t flashAvailable = gCamCapability[cameraId]->flash_available; 2722e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE, 2723e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang &flashAvailable, 1); 2724e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2725e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t avail_ae_modes[5]; 2726e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size = 0; 2727e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) { 2728e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i]; 2729e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size++; 2730e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2731e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (flashAvailable) { 2732e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; 2733e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; 2734e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; 2735e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2736662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 2737662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_ae_modes, 2738e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size); 2739ea44a483c0e98200c058a85ea339457616516847Zhijun He 2740e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t sensitivity_range[2]; 2741e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity; 2742e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity; 2743ea44a483c0e98200c058a85ea339457616516847Zhijun He staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, 2744ea44a483c0e98200c058a85ea339457616516847Zhijun He sensitivity_range, 2745ea44a483c0e98200c058a85ea339457616516847Zhijun He sizeof(sensitivity_range) / sizeof(int32_t)); 27462dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 274773c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, 274873c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy &gCamCapability[cameraId]->max_analog_sensitivity, 274900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 1); 275000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 275173c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 2752e936796df0426c326d043c2359c149024526f4bcShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 2753e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 275473c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy 275500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle; 275600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang staticInfo.update(ANDROID_SENSOR_ORIENTATION, 275700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang &sensor_orientation, 275800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 1); 275900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 276000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang int32_t max_output_streams[3] = {1, 3, 1}; 276100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, 276200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang max_output_streams, 276300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 3); 276400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 2765b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang gStaticMetadata[cameraId] = staticInfo.release(); 2766625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2767625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2769625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2770662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : makeTable 2771662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2772662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes 2773662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2774662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2775662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2776662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2777662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2778662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size, 2779662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t* sizeTable) 2780662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2781662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int j = 0; 2782662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < size; i++) { 2783662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j] = dimTable[i].width; 2784662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j+1] = dimTable[i].height; 2785662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole j+=2; 2786662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2787662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 27880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*=========================================================================== 27900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : makeFPSTable 27910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 27920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges 27930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 27940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS : 27950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 27960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/ 27970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size, 2798c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang int32_t* fpsRangesTable) 27990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{ 28000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int j = 0; 28010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < size; i++) { 2802c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps; 2803c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps; 28040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole j+=2; 28050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole} 28072dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 28082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*=========================================================================== 28092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION : makeOverridesList 28102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 28112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides 28122dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 28132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS : 28142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 28152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 28162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/ 28172dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable, 2818e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t size, uint8_t* overridesList, 28199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t* supported_indexes, 28209443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int camera_id) 28212dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{ 28222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*daemon will give a list of overrides for all scene modes. 28232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang However we should send the fwk only the overrides for the scene modes 28242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported by the framework*/ 28259443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int j = 0, index = 0, supt = 0; 28269443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t focus_override; 28272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang for (int i = 0; i < size; i++) { 28289443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 0; 2829e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang index = supported_indexes[i]; 2830e310738e63535838ed4659a55d540b75abc84c19Ajay Dudani overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON; 28319443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP, 28329443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 28339443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesTable[index].awb_mode); 28349443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override = (uint8_t)overridesTable[index].af_mode; 28359443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) { 28369443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) { 28379443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 1; 28389443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab break; 28399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 28409443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 28419443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (supt) { 28429443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP, 28439443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 28449443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override); 28459443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } else { 28469443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF; 28479443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 28482dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang j+=3; 28492dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang } 28502dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang} 28512dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2852662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2853662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : getPreviewHalPixelFormat 2854662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2855662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework 2856662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2857662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend 2858662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2859662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN : format recognized by framework 2860662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2861662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2862662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format) 2863662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2864662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t halPixelFormat; 2865662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2866662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole switch (format) { 2867662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV12: 2868662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; 2869662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2870662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21: 2871662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2872662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2873662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21_ADRENO: 2874662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO; 2875662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2876662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_YV12: 2877662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YV12; 2878662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2879662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV16: 2880662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV61: 2881662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole default: 2882662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2883662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2884662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return halPixelFormat; 2886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2887662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2888662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 28893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION : getSensorSensitivity 28903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 28913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value 28923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 28933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor 28943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 28953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN : sensitivity supported by sensor 28963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 28973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/ 28983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode) 28993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{ 29003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang int32_t sensitivity; 29013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 29023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang switch (iso_mode) { 29033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_100: 29043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 100; 29053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 29063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_200: 29073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 200; 29083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 29093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_400: 29103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 400; 29113fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 29123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_800: 29133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 800; 29143fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 29153fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_1600: 29163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 1600; 29173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 29183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang default: 29193fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = -1; 29203fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 29213fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 29223fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang return sensitivity; 29233fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang} 29243fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 29253fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 29263fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*=========================================================================== 2927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : AddSetParmEntryToBatch 2928662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2929662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch 2930662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2931662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2932662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @p_table : ptr to parameter buffer 2933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramType : parameter type 2934662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramLength : length of parameter value 2935662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramValue : ptr to parameter value 2936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2937662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 2939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table, 2942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole cam_intf_parm_type_t paramType, 2943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint32_t paramLength, 2944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole void *paramValue) 2945662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2946662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int position = paramType; 2947662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int current, next; 2948662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2949662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2950662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Code to take care of linking next flags * 2951662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2952662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_FIRST_PARAM_ID(p_table); 2953662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position == current){ 2954662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //DO NOTHING 2955662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else if (position < current){ 2956662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, current); 2957662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_FIRST_PARAM_ID(p_table, position); 2958662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 2959662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /* Search for the position in the linked list where we need to slot in*/ 2960662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole while (position > GET_NEXT_PARAM_ID(current, p_table)) 2961662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_NEXT_PARAM_ID(current, p_table); 2962662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2963662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*If node already exists no need to alter linking*/ 2964662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position != GET_NEXT_PARAM_ID(current, p_table)) { 2965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole next = GET_NEXT_PARAM_ID(current, p_table); 2966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(current, p_table, position); 2967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, next); 2968662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2969662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2970662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2971662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2972662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Copy contents into entry * 2973662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2974662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2975662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (paramLength > sizeof(parm_type_t)) { 2976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:Size of input larger than max entry size",__func__); 2977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2978662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2979662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength); 2980662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NO_ERROR; 2981662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2982662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2983662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2984662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupFwkName 2985662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2986662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2987662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2988662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2989662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2990662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2991662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2992662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @hal_name : name of the hal_parm to map 2993662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2994662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int type of status 2995662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * fwk_name -- success 2996662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2997662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 29980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[], 2999662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int hal_name) 3000662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 3001662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3002d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (int i = 0; i < len; i++) { 3003d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang if (arr[i].hal_name == hal_name) 3004d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return arr[i].fwk_name; 3005662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 3006d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 3007d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* Not able to find matching framework type is not necessarily 3008d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * an error case. This happens when mm-camera supports more attributes 3009d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * than the frameworks do */ 3010d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Cannot find matching framework type", __func__); 3011d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return NAME_NOT_FOUND; 3012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 3013662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3014662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 3015662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupHalName 3016662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3017662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 3018662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 3019662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3020662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 3021662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 3022662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 3023662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @fwk_name : name of the hal_parm to map 3024662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3025662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 3026662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * hal_name -- success 3027662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 3028662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 30290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[], 3030662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int fwk_name) 3031662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 3032662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 3033662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].fwk_name == fwk_name) 3034662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].hal_name; 3035662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 30360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Cannot find matching hal type", __func__); 3037662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NAME_NOT_FOUND; 3038662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 3039662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3040662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 3041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 3042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 3044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 3047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 3048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 3050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 3051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 3052625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 3054625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 3055625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 3057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3058625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 3059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 3060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 3061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 3062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 3063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3066b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang if (NULL == gStaticMetadata[cameraId]) { 3067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 3068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 3069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 3070625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3071625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3072625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3073625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 3074625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 3075625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 3076625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 3077625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3078625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 3079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 3080625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 3081625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3082625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 3083625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 3084625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 3085625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 3086625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3087625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3088625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3089625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 3090c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang info->device_version = CAMERA_DEVICE_API_VERSION_3_0; 3091b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang info->static_camera_characteristics = gStaticMetadata[cameraId]; 3092625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 3094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 3098625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3099625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 3100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 3102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 3105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 3106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 310897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type) 3109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3110e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 3111e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3112625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 3113e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 3114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 3115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 3117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 311897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata settings; 3119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 3120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 3121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 31226be371a43545858396aed73240eaa1259df60d2dShuzhen Wang int32_t defaultRequestID = 0; 31236be371a43545858396aed73240eaa1259df60d2dShuzhen Wang settings.update(ANDROID_REQUEST_ID, &defaultRequestID, 1); 3124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 3126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 3128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 3129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 3130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 3131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 3132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 3133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 3134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 3135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 3136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 3137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 3138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 3139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 3140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 3141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 3142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 3143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 3144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 3145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 3146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 3147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 3149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 31509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 31519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 3152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 3154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 3155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 3157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 3158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 3160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 3161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 3163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 3164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 3166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 3167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 316834296c8a11c87ca1c00cfaedddd1f9089344ee80Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; 3169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 3170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3171e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t focusMode; 3172e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) { 3173e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to auto", __func__); 3174e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_AUTO; 3175e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 3176e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to off", __func__); 3177e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_OFF; 3178e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 31792dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1); 31802dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 31812dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; 31822dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 31832dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 3184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 3185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 3186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 3187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3188a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4; 3189a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava settings.update(ANDROID_FLASH_FIRING_POWER, 3190a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava &flashFiringLevel, 1); 3191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 319347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_aperture = gCamCapability[mCameraId]->apertures[0]; 3194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 3195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3196b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang if (gCamCapability[mCameraId]->filter_densities_count) { 319747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 3198b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 3199b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[mCameraId]->filter_densities_count); 3200b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang } 3201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 32029a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang float default_focal_length = gCamCapability[mCameraId]->focal_length; 32039a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 3204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3205e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang /* Exposure time(Update the Min Exposure Time)*/ 3206e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang int64_t default_exposure_time = gCamCapability[mCameraId]->exposure_time_range[0]; 3207e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang settings.update(ANDROID_SENSOR_EXPOSURE_TIME, &default_exposure_time, 1); 3208e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang 320962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang /* frame duration */ 3210f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const int64_t default_frame_duration = NSEC_PER_33MSEC; 321162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang settings.update(ANDROID_SENSOR_FRAME_DURATION, &default_frame_duration, 1); 321262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 321362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang /* sensitivity */ 3214f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const int32_t default_sensitivity = 100; 321562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1); 321662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 3217f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang /*edge mode*/ 3218f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const uint8_t edge_mode = ANDROID_EDGE_MODE_HIGH_QUALITY; 3219f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang settings.update(ANDROID_EDGE_MODE, &edge_mode, 1); 3220f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang 3221f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang /*noise reduction mode*/ 3222f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const uint8_t noise_red_mode = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY; 3223f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang settings.update(ANDROID_NOISE_REDUCTION_MODE, &noise_red_mode, 1); 3224f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang 3225f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang /*color correction mode*/ 3226f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const uint8_t color_correct_mode = ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY; 3227f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang settings.update(ANDROID_COLOR_CORRECTION_MODE, &color_correct_mode, 1); 3228f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang 3229f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang /*transform matrix mode*/ 3230f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const uint8_t tonemap_mode = ANDROID_TONEMAP_MODE_HIGH_QUALITY; 3231f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang settings.update(ANDROID_TONEMAP_MODE, &tonemap_mode, 1); 3232f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang 32339bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab uint8_t edge_strength = (uint8_t)gCamCapability[mCameraId]->sharpness_ctrl.def_value; 32344e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang settings.update(ANDROID_EDGE_STRENGTH, &edge_strength, 1); 32354e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang 32368bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang int32_t scaler_crop_region[4]; 32378bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang scaler_crop_region[0] = 0; 32388bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang scaler_crop_region[1] = 0; 32398bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang scaler_crop_region[2] = gCamCapability[mCameraId]->active_array_size.width; 32408bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang scaler_crop_region[3] = gCamCapability[mCameraId]->active_array_size.height; 32418bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang settings.update(ANDROID_SCALER_CROP_REGION, scaler_crop_region, 4); 32428bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang 32438bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang static const uint8_t antibanding_mode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ; 32448bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang settings.update(ANDROID_CONTROL_AE_ANTIBANDING_MODE, &antibanding_mode, 1); 32458bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang 32468bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang static const uint8_t vs_mode = ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF; 32478bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang settings.update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE, &vs_mode, 1); 32488bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang 32498bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang uint8_t opt_stab_mode = (gCamCapability[mCameraId]->optical_stab_modes_count == 2)? 32508bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang ANDROID_LENS_OPTICAL_STABILIZATION_MODE_ON : 32518bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 32528bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang settings.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE, &opt_stab_mode, 1); 32538bb288a4ce754dc25f447d5509f2a8adbb5d1ebaShuzhen Wang 3254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 3255e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3256e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 3257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 3258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 326180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 326280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 326380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 326480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 326580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 326680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 326762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * @request : request that needs to be serviced 326834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * @streamTypeMask : bit mask of stream types on which buffers are requested 326980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 327080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 327180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 327280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 327362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(camera3_capture_request_t *request, 327462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang uint32_t streamTypeMask) 327580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 327680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 327780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 327862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (request->settings == NULL && mFirstRequest) { 327980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 328080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 3281662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 328233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 3283b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 3284b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang 3285b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 328633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 328762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 3288b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(hal_version), &hal_version); 328962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (rc < 0) { 329062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGE("%s: Failed to set hal version in the parameters", __func__); 329162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return BAD_VALUE; 329262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 329333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 3294662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*we need to update the frame number in the parameters*/ 3295662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 329662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang sizeof(request->frame_number), &(request->frame_number)); 3297662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (rc < 0) { 3298662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s: Failed to set the frame number in the parameters", __func__); 3299662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 3300662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 33010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 330234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy /* Update stream id mask where buffers are requested */ 330334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK, 330434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy sizeof(streamTypeMask), &streamTypeMask); 330534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy if (rc < 0) { 330634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy ALOGE("%s: Failed to set stream type mask in the parameters", __func__); 330734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy return BAD_VALUE; 330834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy } 330934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy 331062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if(request->settings != NULL){ 331162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = translateMetadataToParameters(request); 331280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 331380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 3314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 331580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 331680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 331780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 331880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 331980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 332080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 332180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 332280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 332380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 332480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 332562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * @request : request sent from framework 332680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 332780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 332880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 332980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 333080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 333180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 333262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang (const camera3_capture_request_t *request) 333380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 3334662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 333597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata frame_settings; 333662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang frame_settings = request->settings; 33370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33380b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang /* Do not change the order of the following list unless you know what you are 33390b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * doing. 33400b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * The order is laid out in such a way that parameters in the front of the table 33410b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * may be used to override the parameters later in the table. Examples are: 33420b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * 1. META_MODE should precede AEC/AWB/AF MODE 33430b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * 2. AEC MODE should preced EXPOSURE_TIME/SENSITIVITY/FRAME_DURATION 33440b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * 3. AWB_MODE should precede COLOR_CORRECTION_MODE 33450b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * 4. Any mode should precede it's corresponding settings 33460b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang */ 33470b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_MODE)) { 33480b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0]; 33490b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE, 33500b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(metaMode), &metaMode); 33510b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) { 33520b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0]; 33530b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP, 33540b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 33550b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang fwk_sceneMode); 33560b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 33570b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(sceneMode), &sceneMode); 33580b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } else if (metaMode == ANDROID_CONTROL_MODE_OFF) { 335934296c8a11c87ca1c00cfaedddd1f9089344ee80Shuzhen Wang uint8_t sceneMode = CAM_SCENE_MODE_OFF; 33600b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 33610b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(sceneMode), &sceneMode); 33620b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) { 336334296c8a11c87ca1c00cfaedddd1f9089344ee80Shuzhen Wang uint8_t sceneMode = CAM_SCENE_MODE_OFF; 33640b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 33650b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(sceneMode), &sceneMode); 33660b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 33670b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 33680b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 33690b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 33700b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t fwk_aeMode = 33710b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 33720b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t aeMode; 33730b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang int32_t redeye; 33740b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 33750b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) { 33760b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang aeMode = CAM_AE_MODE_OFF; 33770b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } else { 33780b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang aeMode = CAM_AE_MODE_ON; 33790b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 33800b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 33810b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang redeye = 1; 33820b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } else { 33830b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang redeye = 0; 33840b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 33850b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 33860b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP, 33870b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(AE_FLASH_MODE_MAP), 33880b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang fwk_aeMode); 33890b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE, 33900b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(aeMode), &aeMode); 33910b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 33920b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(flashMode), &flashMode); 33930b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION, 33940b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(redeye), &redeye); 33950b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 33960b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 33970b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) { 33980b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t fwk_whiteLevel = 33990b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0]; 34000b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP, 34010b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP), 34020b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang fwk_whiteLevel); 34030b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE, 34040b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(whiteLevel), &whiteLevel); 34050b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 34060b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 34070b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang float focalDistance = -1.0; 34080b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) { 34090b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0]; 34100b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 34110b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang CAM_INTF_META_LENS_FOCUS_DISTANCE, 34120b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(focalDistance), &focalDistance); 34130b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 34140b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 34150b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) { 34160b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t fwk_focusMode = 34170b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0]; 34180b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t focusMode; 34190b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) { 34200b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang focusMode = CAM_FOCUS_MODE_INFINITY; 34210b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } else{ 34220b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang focusMode = lookupHalName(FOCUS_MODES_MAP, 34230b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(FOCUS_MODES_MAP), 34240b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang fwk_focusMode); 34250b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 34260b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE, 34270b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(focusMode), &focusMode); 34280b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 34290b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 34300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) { 34310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t antibandingMode = 34320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0]; 34330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING, 34340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(antibandingMode), &antibandingMode); 34350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 343697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 343753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 3438e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t expCompensation = frame_settings.find( 3439e936796df0426c326d043c2359c149024526f4bcShuzhen Wang ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 3440fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min) 3441fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_compensation_min; 3442fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max) 3443fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_compensation_max; 344453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION, 344553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab sizeof(expCompensation), &expCompensation); 344653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 344753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab 34480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) { 34490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0]; 34500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK, 34510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeLock), &aeLock); 34520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) { 34540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_fps_range_t fps_range; 34550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.min_fps = 34560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 34570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.max_fps = 34589443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1]; 34590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE, 34600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(fps_range), &fps_range); 34610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 346297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 34630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) { 34640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t awbLock = 34650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0]; 34660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK, 34670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(awbLock), &awbLock); 34680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 34700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) { 34710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_effectMode = 34720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0]; 34730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP, 34740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(EFFECT_MODES_MAP), 34750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_effectMode); 34760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT, 34770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(effectMode), &effectMode); 34780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 34800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) { 34810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t colorCorrectMode = 34820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0]; 34830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = 34840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE, 34850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(colorCorrectMode), &colorCorrectMode); 34860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3487d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3488d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) { 3489d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_gains_t colorCorrectGains; 3490d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int i = 0; i < 4; i++) { 3491d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy colorCorrectGains.gains[i] = 3492d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i]; 3493d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3494d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = 3495d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_GAINS, 3496d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(colorCorrectGains), &colorCorrectGains); 3497d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3498d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3499d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) { 3500d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_matrix_t colorCorrectTransform; 3501d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_rational_type_t transform_elem; 3502d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy int num = 0; 3503d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int i = 0; i < 3; i++) { 3504d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 3; j++) { 3505d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy transform_elem.numerator = 3506d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator; 3507d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy transform_elem.denominator = 3508d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator; 3509d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy colorCorrectTransform.transform_matrix[i][j] = transform_elem; 3510d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy num++; 3511d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3512d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3513d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = 3514d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_TRANSFORM, 3515d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(colorCorrectTransform), &colorCorrectTransform); 3516d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3517d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3518e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang cam_trigger_t aecTrigger; 3519e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE; 3520e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger_id = -1; 35212dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&& 35222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) { 35232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger = 35240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0]; 35252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger_id = 35262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0]; 35270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, 35291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(aecTrigger), &aecTrigger); 35300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35312dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*af_trigger must come with a trigger id*/ 35322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) && 35332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) { 35342dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang cam_trigger_t af_trigger; 35352dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger = 35360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0]; 35372dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger_id = 35382dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0]; 35390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 35402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger); 35410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) { 35440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t demosaic = 35450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0]; 35460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC, 35470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(demosaic), &demosaic); 35480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_MODE)) { 3551f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang cam_edge_application_t edge_application; 3552f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang edge_application.edge_mode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 3553f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang if (edge_application.edge_mode == CAM_EDGE_MODE_OFF) { 3554f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang edge_application.sharpness = 0; 3555f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang } else { 35564e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) { 35579bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab uint8_t edgeStrength = 35589bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab frame_settings.find(ANDROID_EDGE_STRENGTH).data.u8[0]; 35599bdb10cd8e81bd31408146118ef57bdea6e79891Mansoor Aftab edge_application.sharpness = (int32_t)edgeStrength; 35604e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang } else { 35614e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang edge_application.sharpness = gCamCapability[mCameraId]->sharpness_ctrl.def_value; //default 35624e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang } 3563f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang } 3564d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE_MODE, 3565f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang sizeof(edge_application), &edge_application); 35660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 3568e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (frame_settings.exists(ANDROID_FLASH_MODE)) { 35696356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani int32_t respectFlashMode = 1; 35706356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 35716356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t fwk_aeMode = 35726356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 35736356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) { 35746356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani respectFlashMode = 0; 35756356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: AE Mode controls flash, ignore android.flash.mode", 35766356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani __func__); 35776356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 35786356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 35796356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (respectFlashMode) { 35806356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t flashMode = 35816356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_FLASH_MODE).data.u8[0]; 35826356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP, 35836356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(FLASH_MODES_MAP), 35846356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode); 35856356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: flash mode after mapping %d", __func__, flashMode); 35866356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani // To check: CAM_INTF_META_FLASH_MODE usage 35876356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 35886356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(flashMode), &flashMode); 35896356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 3590e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 3591e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 35920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) { 35930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t flashPower = 35940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0]; 35950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER, 35960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(flashPower), &flashPower); 35970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) { 36000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t flashFiringTime = 36010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0]; 36020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 36030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime); 36040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 36060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) { 36070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t geometricMode = 36080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0]; 36090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE, 36100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricMode), &geometricMode); 36110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 36130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) { 36148867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t geometricStrength = 36150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0]; 36160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 36170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_GEOMETRIC_STRENGTH, 36180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricStrength), &geometricStrength); 36190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 36210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) { 36220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t hotPixelMode = 36230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0]; 36240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE, 36250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(hotPixelMode), &hotPixelMode); 36260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 36280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_APERTURE)) { 36290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float lensAperture = 36300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find( ANDROID_LENS_APERTURE).data.f[0]; 36310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE, 36320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(lensAperture), &lensAperture); 36330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 36350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) { 36360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float filterDensity = 36370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0]; 36380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY, 36390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(filterDensity), &filterDensity); 36400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 36420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 36430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float focalLength = 36440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 36450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 36460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_FOCAL_LENGTH, 36470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focalLength), &focalLength); 36480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 36500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) { 36510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t optStabMode = 36520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0]; 36538867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 36540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_OPT_STAB_MODE, 36550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(optStabMode), &optStabMode); 36560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 36580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) { 36590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedMode = 36600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]; 36618867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 36620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_MODE, 36630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedMode), &noiseRedMode); 36640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 36660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) { 36670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedStrength = 36680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0]; 36698867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 36700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_STRENGTH, 36710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedStrength), &noiseRedStrength); 36720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 367471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang cam_crop_region_t scalerCropRegion; 367571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool scalerCropSet = false; 36760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) { 36770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.left = 36780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0]; 36790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.top = 36800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1]; 36810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.width = 36820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2]; 368347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang scalerCropRegion.height = 368447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3]; 36850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 36860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SCALER_CROP_REGION, 36870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(scalerCropRegion), &scalerCropRegion); 368871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropSet = true; 36890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 36910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { 36920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorExpTime = 36930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0]; 369462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: setting sensorExpTime %lld", __func__, sensorExpTime); 36950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 36960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_EXPOSURE_TIME, 36970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorExpTime), &sensorExpTime); 36980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 37000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) { 37010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorFrameDuration = 37020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0]; 370362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int64_t minFrameDuration = getMinFrameDuration(request); 370462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang sensorFrameDuration = MAX(sensorFrameDuration, minFrameDuration); 3705e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration) 3706e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration; 370762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: clamp sensorFrameDuration to %lld", __func__, sensorFrameDuration); 37080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 37090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_FRAME_DURATION, 37100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorFrameDuration), &sensorFrameDuration); 37110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 37130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 37140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t sensorSensitivity = 37150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 3716e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity < 3717e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity) 3718e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 3719e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity; 3720e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity > 3721e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity) 3722e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 3723e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity; 372462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: clamp sensorSensitivity to %d", __func__, sensorSensitivity); 37250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 37260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_SENSITIVITY, 37270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorSensitivity), &sensorSensitivity); 37280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 37300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_MODE)) { 37310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t shadingMode = 37320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_MODE).data.u8[0]; 37330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE, 37340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingMode), &shadingMode); 37350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 37370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) { 37380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t shadingStrength = 37390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0]; 37400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH, 37410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingStrength), &shadingStrength); 37420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 37440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) { 37456990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t fwk_facedetectMode = 37460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0]; 37476990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t facedetectMode = 37486990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang lookupHalName(FACEDETECT_MODES_MAP, 37496990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode); 37500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 37510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_FACEDETECT_MODE, 37520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(facedetectMode), &facedetectMode); 37530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 37550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) { 37560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t histogramMode = 37570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0]; 37580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 37590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_HISTOGRAM_MODE, 37600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(histogramMode), &histogramMode); 37610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 37630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) { 37640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t sharpnessMapMode = 37650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0]; 37660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 37670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, 37680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sharpnessMapMode), &sharpnessMapMode); 37690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 37710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_TONEMAP_MODE)) { 37720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t tonemapMode = 37730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0]; 37740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 37750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_TONEMAP_MODE, 37760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(tonemapMode), &tonemapMode); 37770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3778e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* Tonemap curve channels ch0 = G, ch 1 = B, ch 2 = R */ 3779e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /*All tonemap channels will have the same number of points*/ 3780e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN) && 3781e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE) && 3782e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) { 3783e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_rgb_tonemap_curves tonemapCurves; 3784e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.tonemap_points_cnt = frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).count/2; 3785e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3786e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch0 = G*/ 3787e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang int point = 0; 3788e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_tonemap_curve_t tonemapCurveGreen; 3789e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt ; i++) { 3790d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3791e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurveGreen.tonemap_points[i][j] = 3792e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point]; 3793d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3794d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3795d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3796e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[0] = tonemapCurveGreen; 3797e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3798e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch 1 = B */ 3799e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang point = 0; 3800e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_tonemap_curve_t tonemapCurveBlue; 3801e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 3802d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3803e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurveBlue.tonemap_points[i][j] = 3804e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point]; 3805d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3806d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3807d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3808e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[1] = tonemapCurveBlue; 3809e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3810e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch 2 = R */ 3811e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang point = 0; 3812d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_tonemap_curve_t tonemapCurveRed; 3813e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 3814d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3815d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy tonemapCurveRed.tonemap_points[i][j] = 3816d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point]; 3817d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3818d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3819d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3820e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[2] = tonemapCurveRed; 3821e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3822d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, 3823e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang CAM_INTF_META_TONEMAP_CURVES, 3824e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang sizeof(tonemapCurves), &tonemapCurves); 3825d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 38260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 38270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 38280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t captureIntent = 38290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 38300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 38310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(captureIntent), &captureIntent); 38320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3833662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3834d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) { 3835d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t blackLevelLock = 3836d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0]; 3837d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_BLACK_LEVEL_LOCK, 3838d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(blackLevelLock), &blackLevelLock); 3839d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3840d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3841d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) { 3842d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t lensShadingMapMode = 3843d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0]; 3844d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE, 3845d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(lensShadingMapMode), &lensShadingMapMode); 3846d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3847d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 384859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) { 384959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 385071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 385162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AE_REGIONS); 385271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 385371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 385471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 385571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 385671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI, 385771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 385871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 385959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 386059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 386159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) { 386259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 386371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 386462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AF_REGIONS); 386571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 386671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 386771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 386871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 386971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI, 387071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 387171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 387259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 387359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 387459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) { 387559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 387671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 387762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AWB_REGIONS); 387871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 387971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 388071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 388171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 388271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS, 388371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 388471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 388559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 3886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 3887662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 3888662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3889662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 38900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : getJpegSettings 3891662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 38920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL 3893662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3894662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3895662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 3896662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @settings : frame settings information from framework 3897662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3898662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3899662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : success: NO_ERROR 3900662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * failure: 3901662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 3902662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings 3903662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (const camera_metadata_t *settings) 3904662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 3905662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (mJpegSettings) { 39069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_timestamp) { 39079a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_timestamp); 39089a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 39099a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 39109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_coordinates) { 39119a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 39129a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_coordinates[i]); 39139a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 39149a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 39159a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 3916662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole free(mJpegSettings); 3917662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = NULL; 3918662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 3919662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t)); 392097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata jpeg_settings; 3921662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings = settings; 3922662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 39230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) { 39240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 39250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0]; 39260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 39270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 0; 39280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 39290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) { 39300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_quality = 39310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0]; 39320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 39331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mJpegSettings->jpeg_quality = 85; 39340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 39350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) { 39360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.width = 39370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0]; 39380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.height = 39390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1]; 39400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 394108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.width = 0; 394208ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.height = 0; 39430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 39440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) { 39450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < 3; i++) { 39469a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*)); 39479a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_coordinates[i]) = 39480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i]; 39490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 39503fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else{ 39519a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 39529a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 39533fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 39540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 39559a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 39560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { 39579a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*)); 39589a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_timestamp) = 39590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0]; 39609a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 39619a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 39620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 39630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 39640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { 39659a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count; 39669a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < len; i++) { 39679a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[i] = 39689a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i]; 39699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 39709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_processing_method[len-1] != '\0') { 39719a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[len] = '\0'; 39729a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 39739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 39749a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[0] = '\0'; 39750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 39763fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 39770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 39780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->sensor_sensitivity = 39790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 39803fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else { 39813fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed; 39820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 39839a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 39840b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi mJpegSettings->sensor_exposure_time = mMetadataResponse.exposure_time; 39850b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi 39860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 39870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->lens_focal_length = 39880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 39890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 399053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 399153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_compensation = 399253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 399353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 3994f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang mJpegSettings->sharpness = 10; //default value 3995f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang if (jpeg_settings.exists(ANDROID_EDGE_MODE)) { 3996f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang uint8_t edgeMode = jpeg_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 3997f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang if (edgeMode == ANDROID_EDGE_MODE_OFF) { 3998f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang mJpegSettings->sharpness = 0; 3999f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang } 4000f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang } 400153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step; 40020a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab mJpegSettings->max_jpeg_size = calcMaxJpegSize(); 40037ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->is_jpeg_format = true; 40047ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask; 400580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 400680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 400780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 400880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 4009e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 4010625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 4012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 4014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 4015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 4016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 4017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 4019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 40201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata, 4021e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, 4022e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frame_number, void *userdata) 4023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 4024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 4025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 4026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 4027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 4028625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 4029625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4030e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->captureResultCb(metadata, buffer, frame_number); 4031625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 4032625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 4033625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 40347ee407aa1024789089aad411c372c79423699976Ajay Dudani 4035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 4036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 4037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 4039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 4041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 4044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 4045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 4046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 4048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 4049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 4050d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 4051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 4052625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 4053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 4054625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 4055625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 4056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 4057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 40581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->initialize(callback_ops); 4059d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 40601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 4061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 4062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 4064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 4065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 4067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 4069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4070625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4071625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 4072625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 4073625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 4074625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 4075625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4076625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 4077625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 4078625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 4079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 4080d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 4081625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 4082625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 4083625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 4084625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 4085625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 4086625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 40871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->configureStreams(stream_list); 4088d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 40891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 4090625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 4091625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4092625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 4093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 4094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 4096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 4098625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4099625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 4100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 4101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 4102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 4103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 4104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 4105d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 4106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 4107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 4108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 4109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 4110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 4111625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 41121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->registerStreamBuffers(buffer_set); 4113d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 41141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 4115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 4116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 4118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 4119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 4121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 4123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 4126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 4127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 41289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 41299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 41309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 4131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 4132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4133d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 4134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 4135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 4136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 4137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 4138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 4139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 4140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 4141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 414297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole fwk_metadata = hw->translateCapabilityToMetadata(type); 4143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4144d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 4145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 4146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 4147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 4149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 4150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 4152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 4154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 4157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 41589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 41599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 41609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 4161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 4162d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 416380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 416480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 416580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 416680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 41679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 416880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 41699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 41701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->processCaptureRequest(request); 4171d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 41721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 4173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 4174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 4176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 4177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 4179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 4181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 4184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 4185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4186e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops( 4187e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, 4188e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang vendor_tag_query_ops_t* ops) 4189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 4190d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 4191e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 4192e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 4193e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 4194e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 4195e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 4196e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 4197e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 4198e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->getMetadataVendorTagOps(ops); 4199d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 4200e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 4201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 4202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 4204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 4205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 4207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 4209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 4212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 4213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4214e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump( 4215e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, int fd) 4216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 4217d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 4218e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 4219e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 4220e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 4221e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 4222e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 4223e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 4224e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 4225e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->dump(fd); 4226d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 4227e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 4228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 4229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4230e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 4231c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION : flush 4232c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 4233c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION: 4234c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 4235c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS : 4236c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 4237c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 4238c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN : 4239c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/ 4240c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 4241c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush( 4242c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang const struct camera3_device *device) 4243c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{ 4244c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang int rc; 4245c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGV("%s: E", __func__); 4246c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang QCamera3HardwareInterface *hw = 4247c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 4248c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang if (!hw) { 4249c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGE("%s: NULL camera device", __func__); 4250c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return -EINVAL; 4251c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang } 4252c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 4253c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang rc = hw->flush(); 4254c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGV("%s: X", __func__); 4255c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return rc; 4256c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang} 4257c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 4258c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*=========================================================================== 4259e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : close_camera_device 4260e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 4261e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 4262e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 4263e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 4264e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 4265e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 4266e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 4267e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 4268e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 4269e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 4270d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 4271e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int ret = NO_ERROR; 4272e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 4273e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>( 4274e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<camera3_device_t *>(device)->priv); 4275e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 4276e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("NULL camera device"); 4277e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return BAD_VALUE; 4278e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 4279e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete hw; 4280cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 4281cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 4282cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 0; 4283cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 4284d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 4285e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return ret; 4286e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 4287e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 42887ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 42897ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : getWaveletDenoiseProcessPlate 42907ee407aa1024789089aad411c372c79423699976Ajay Dudani * 42917ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate 42927ee407aa1024789089aad411c372c79423699976Ajay Dudani * 42937ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None 42947ee407aa1024789089aad411c372c79423699976Ajay Dudani * 42957ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : WNR prcocess plate vlaue 42967ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 42977ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate() 42987ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 42997ee407aa1024789089aad411c372c79423699976Ajay Dudani char prop[PROPERTY_VALUE_MAX]; 43007ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(prop, 0, sizeof(prop)); 43017ee407aa1024789089aad411c372c79423699976Ajay Dudani property_get("persist.denoise.process.plates", prop, "0"); 43027ee407aa1024789089aad411c372c79423699976Ajay Dudani int processPlate = atoi(prop); 43037ee407aa1024789089aad411c372c79423699976Ajay Dudani switch(processPlate) { 43047ee407aa1024789089aad411c372c79423699976Ajay Dudani case 0: 43057ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_YCBCR_PLANE; 43067ee407aa1024789089aad411c372c79423699976Ajay Dudani case 1: 43077ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_CBCR_ONLY; 43087ee407aa1024789089aad411c372c79423699976Ajay Dudani case 2: 43097ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 43107ee407aa1024789089aad411c372c79423699976Ajay Dudani case 3: 43117ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINED_CBCR; 43127ee407aa1024789089aad411c372c79423699976Ajay Dudani default: 43137ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 43147ee407aa1024789089aad411c372c79423699976Ajay Dudani } 43157ee407aa1024789089aad411c372c79423699976Ajay Dudani} 43167ee407aa1024789089aad411c372c79423699976Ajay Dudani 43177ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 43187ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : needRotationReprocess 43197ee407aa1024789089aad411c372c79423699976Ajay Dudani * 43207ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp 43217ee407aa1024789089aad411c372c79423699976Ajay Dudani * 43227ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 43237ee407aa1024789089aad411c372c79423699976Ajay Dudani * 43247ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : true: needed 43257ee407aa1024789089aad411c372c79423699976Ajay Dudani * false: no need 43267ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 43277ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess() 43287ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 43297ee407aa1024789089aad411c372c79423699976Ajay Dudani 43307ee407aa1024789089aad411c372c79423699976Ajay Dudani if (!mJpegSettings->is_jpeg_format) { 43317ee407aa1024789089aad411c372c79423699976Ajay Dudani // RAW image, no need to reprocess 43327ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 43337ee407aa1024789089aad411c372c79423699976Ajay Dudani } 43347ee407aa1024789089aad411c372c79423699976Ajay Dudani 43357ee407aa1024789089aad411c372c79423699976Ajay Dudani if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 && 43367ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->jpeg_orientation > 0) { 43377ee407aa1024789089aad411c372c79423699976Ajay Dudani // current rotation is not zero, and pp has the capability to process rotation 43387ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGD("%s: need do reprocess for rotation", __func__); 43397ee407aa1024789089aad411c372c79423699976Ajay Dudani return true; 43407ee407aa1024789089aad411c372c79423699976Ajay Dudani } 43417ee407aa1024789089aad411c372c79423699976Ajay Dudani 43427ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 43437ee407aa1024789089aad411c372c79423699976Ajay Dudani} 43447ee407aa1024789089aad411c372c79423699976Ajay Dudani 43457ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 4346c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * FUNCTION : needReprocess 4347c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 4348c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * DESCRIPTION: if reprocess in needed 4349c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 4350c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * PARAMETERS : none 4351c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 4352c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * RETURN : true: needed 4353c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * false: no need 4354c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *==========================================================================*/ 4355c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajanbool QCamera3HardwareInterface::needReprocess() 4356c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan{ 4357c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if (!mJpegSettings->is_jpeg_format) { 4358c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // RAW image, no need to reprocess 4359c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return false; 4360c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 4361c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 4362c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if ((mJpegSettings->min_required_pp_mask > 0) || 4363c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan isWNREnabled()) { 4364c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // TODO: add for ZSL HDR later 4365c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // pp module has min requirement for zsl reprocess, or WNR in ZSL mode 4366c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__); 4367c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return true; 4368c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 4369c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return needRotationReprocess(); 4370c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan} 4371c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 4372c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan/*=========================================================================== 43737ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : addOnlineReprocChannel 43747ee407aa1024789089aad411c372c79423699976Ajay Dudani * 43757ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames 43767ee407aa1024789089aad411c372c79423699976Ajay Dudani * coming from input channel 43777ee407aa1024789089aad411c372c79423699976Ajay Dudani * 43787ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 43797ee407aa1024789089aad411c372c79423699976Ajay Dudani * @pInputChannel : ptr to input channel whose frames will be post-processed 43807ee407aa1024789089aad411c372c79423699976Ajay Dudani * 43817ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : Ptr to the newly created channel obj. NULL if failed. 43827ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 43837ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel( 4384d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle) 43857ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 43867ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t rc = NO_ERROR; 43877ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3ReprocessChannel *pChannel = NULL; 43887ee407aa1024789089aad411c372c79423699976Ajay Dudani if (pInputChannel == NULL) { 43897ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: input channel obj is NULL", __func__); 43907ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 43917ee407aa1024789089aad411c372c79423699976Ajay Dudani } 43927ee407aa1024789089aad411c372c79423699976Ajay Dudani 43937ee407aa1024789089aad411c372c79423699976Ajay Dudani pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle, 43947ee407aa1024789089aad411c372c79423699976Ajay Dudani mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle); 43957ee407aa1024789089aad411c372c79423699976Ajay Dudani if (NULL == pChannel) { 43967ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: no mem for reprocess channel", __func__); 43977ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 43987ee407aa1024789089aad411c372c79423699976Ajay Dudani } 43997ee407aa1024789089aad411c372c79423699976Ajay Dudani 44007ee407aa1024789089aad411c372c79423699976Ajay Dudani // Capture channel, only need snapshot and postview streams start together 44017ee407aa1024789089aad411c372c79423699976Ajay Dudani mm_camera_channel_attr_t attr; 44027ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 44037ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 44047ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue(); 44057ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->initialize(); 44067ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 44077ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc); 44087ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 44097ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 44107ee407aa1024789089aad411c372c79423699976Ajay Dudani } 44117ee407aa1024789089aad411c372c79423699976Ajay Dudani 44127ee407aa1024789089aad411c372c79423699976Ajay Dudani // pp feature config 44137ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_pp_feature_config_t pp_config; 44147ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&pp_config, 0, sizeof(cam_pp_feature_config_t)); 44157ee407aa1024789089aad411c372c79423699976Ajay Dudani if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) { 44167ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS; 4417f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang pp_config.sharpness = mJpegSettings->sharpness; 44187ee407aa1024789089aad411c372c79423699976Ajay Dudani } 44197ee407aa1024789089aad411c372c79423699976Ajay Dudani 44207ee407aa1024789089aad411c372c79423699976Ajay Dudani if (isWNREnabled()) { 44217ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D; 44227ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.denoise_enable = 1; 44237ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate(); 44247ee407aa1024789089aad411c372c79423699976Ajay Dudani } 44257ee407aa1024789089aad411c372c79423699976Ajay Dudani if (needRotationReprocess()) { 44267ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION; 44277ee407aa1024789089aad411c372c79423699976Ajay Dudani int rotation = mJpegSettings->jpeg_orientation; 44287ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rotation == 0) { 44297ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_0; 44307ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 90) { 44317ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_90; 44327ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 180) { 44337ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_180; 44347ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 270) { 44357ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_270; 44367ee407aa1024789089aad411c372c79423699976Ajay Dudani } 44377ee407aa1024789089aad411c372c79423699976Ajay Dudani } 44387ee407aa1024789089aad411c372c79423699976Ajay Dudani 44397ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->addReprocStreamsFromSource(pp_config, 44407ee407aa1024789089aad411c372c79423699976Ajay Dudani pInputChannel, 44417ee407aa1024789089aad411c372c79423699976Ajay Dudani mMetadataChannel); 44427ee407aa1024789089aad411c372c79423699976Ajay Dudani 44437ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 44447ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 44457ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 44467ee407aa1024789089aad411c372c79423699976Ajay Dudani } 44477ee407aa1024789089aad411c372c79423699976Ajay Dudani return pChannel; 44487ee407aa1024789089aad411c372c79423699976Ajay Dudani} 44497ee407aa1024789089aad411c372c79423699976Ajay Dudani 44507ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue() 44517ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 44527ee407aa1024789089aad411c372c79423699976Ajay Dudani return gCamCapability[mCameraId]->min_num_pp_bufs; 44537ee407aa1024789089aad411c372c79423699976Ajay Dudani} 44547ee407aa1024789089aad411c372c79423699976Ajay Dudani 4455acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajanbool QCamera3HardwareInterface::isWNREnabled() { 4456acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan return gCamCapability[mCameraId]->isWnrSupported; 4457acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan} 4458acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan 4459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 4460