QCamera3HWI.cpp revision e2f4853167052a8f9c3aa42daf56d88cfa9090e3
1625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 2625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 3625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* Redistribution and use in source and binary forms, with or without 4625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* modification, are permitted provided that the following conditions are 5625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* met: 6625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Redistributions of source code must retain the above copyright 7625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* notice, this list of conditions and the following disclaimer. 8625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Redistributions in binary form must reproduce the above 9625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* copyright notice, this list of conditions and the following 10625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* disclaimer in the documentation and/or other materials provided 11625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* with the distribution. 12625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Neither the name of The Linux Foundation nor the names of its 13625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* contributors may be used to endorse or promote products derived 14625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* from this software without specific prior written permission. 15625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 16625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 28625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*/ 29625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 30625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define LOG_TAG "QCamera3HWI" 31625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <cutils/properties.h> 33625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h> 34625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <camera/CameraMetadata.h> 35625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <stdlib.h> 36625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h> 37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h> 38e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <ui/Fence.h> 39625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h> 40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h" 41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h" 42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h" 4366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h" 44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android; 46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera { 4862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 4962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang#define MAX(a, b) ((a) > (b) ? (a) : (b)) 5062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 51625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS]; 5380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings; 54b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS]; 55625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 56cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangpthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock = 57cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang PTHREAD_MUTEX_INITIALIZER; 58cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangunsigned int QCamera3HardwareInterface::mCameraSessionActive = 0; 59cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 60662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = { 61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_OFF, CAM_EFFECT_MODE_OFF }, 62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_MONO, CAM_EFFECT_MODE_MONO }, 63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE, CAM_EFFECT_MODE_NEGATIVE }, 64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE, CAM_EFFECT_MODE_SOLARIZE }, 65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SEPIA, CAM_EFFECT_MODE_SEPIA }, 66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE, CAM_EFFECT_MODE_POSTERIZE }, 67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD }, 68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD }, 69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_AQUA, CAM_EFFECT_MODE_AQUA } 70662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = { 730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_OFF, CAM_WB_MODE_OFF }, 74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_AUTO, CAM_WB_MODE_AUTO }, 75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_INCANDESCENT, CAM_WB_MODE_INCANDESCENT }, 76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_FLUORESCENT, CAM_WB_MODE_FLUORESCENT }, 77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT}, 78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_DAYLIGHT, CAM_WB_MODE_DAYLIGHT }, 79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT }, 80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_TWILIGHT, CAM_WB_MODE_TWILIGHT }, 81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_SHADE, CAM_WB_MODE_SHADE } 82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = { 85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_ACTION, CAM_SCENE_MODE_ACTION }, 86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PORTRAIT, CAM_SCENE_MODE_PORTRAIT }, 87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE, CAM_SCENE_MODE_LANDSCAPE }, 88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT, CAM_SCENE_MODE_NIGHT }, 89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT }, 90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_THEATRE, CAM_SCENE_MODE_THEATRE }, 91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BEACH, CAM_SCENE_MODE_BEACH }, 92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SNOW, CAM_SCENE_MODE_SNOW }, 93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SUNSET, CAM_SCENE_MODE_SUNSET }, 94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO, CAM_SCENE_MODE_ANTISHAKE }, 95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_FIREWORKS , CAM_SCENE_MODE_FIREWORKS }, 96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SPORTS , CAM_SCENE_MODE_SPORTS }, 97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PARTY, CAM_SCENE_MODE_PARTY }, 98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT, CAM_SCENE_MODE_CANDLELIGHT }, 9997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BARCODE, CAM_SCENE_MODE_BARCODE} 100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = { 103b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang { ANDROID_CONTROL_AF_MODE_OFF, CAM_FOCUS_MODE_FIXED }, 104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_AUTO, CAM_FOCUS_MODE_AUTO }, 105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_MACRO, CAM_FOCUS_MODE_MACRO }, 106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_EDOF, CAM_FOCUS_MODE_EDOF }, 107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE }, 108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO, CAM_FOCUS_MODE_CONTINOUS_VIDEO } 109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = { 112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, CAM_ANTIBANDING_MODE_OFF }, 113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ }, 114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ }, 115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO } 116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 118e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = { 119e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_OFF, CAM_FLASH_MODE_OFF }, 120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON, CAM_FLASH_MODE_OFF }, 121e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH, CAM_FLASH_MODE_AUTO}, 122e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH, CAM_FLASH_MODE_ON }, 123e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO} 124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = { 127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_OFF, CAM_FLASH_MODE_OFF }, 1286356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE }, 1296356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani { ANDROID_FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH } 130662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 131662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1326990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FACEDETECT_MODES_MAP[] = { 1336990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang { ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, CAM_FACE_DETECT_MODE_OFF }, 1346990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang { ANDROID_STATISTICS_FACE_DETECT_MODE_FULL, CAM_FACE_DETECT_MODE_FULL } 1356990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang}; 1366990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang 13708ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288, 13808ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab 320, 240, 176, 144, 0, 0}; 139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = { 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang initialize: QCamera3HardwareInterface::initialize, 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang configure_streams: QCamera3HardwareInterface::configure_streams, 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang register_stream_buffers: QCamera3HardwareInterface::register_stream_buffers, 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings, 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang process_capture_request: QCamera3HardwareInterface::process_capture_request, 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang get_metadata_vendor_tag_ops: QCamera3HardwareInterface::get_metadata_vendor_tag_ops, 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang dump: QCamera3HardwareInterface::dump, 148c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang flush: QCamera3HardwareInterface::flush, 149c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang reserved: {0}, 150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; 151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3HardwareInterface 155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface 157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera ID 160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId) 164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang : mCameraId(cameraId), 165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle(NULL), 166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened(false), 167cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraInitialized(false), 16897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mCallbackOps(NULL), 16933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mInputStream(NULL), 17033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mMetadataChannel(NULL), 1717ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel(NULL), 17233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest(false), 17333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap(NULL), 17433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters(NULL), 17599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan mJpegSettings(NULL), 1768bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode(false), 17762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinProcessedFrameDuration(0), 17862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinJpegFrameDuration(0), 17962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinRawFrameDuration(0), 18099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule(NULL) 181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 183e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0; 184e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.close = close_camera_device; 185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.ops = &mCameraOps; 186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.priv = this; 187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->version = CAM_HAL_V3; 1887ee407aa1024789089aad411c372c79423699976Ajay Dudani // TODO: hardcode for now until mctl add support for min_num_pp_bufs 1897ee407aa1024789089aad411c372c79423699976Ajay Dudani //TBD - To see if this hardcoding is needed. Check by printing if this is filled by mctl to 3 1907ee407aa1024789089aad411c372c79423699976Ajay Dudani gCamCapability[cameraId]->min_num_pp_bufs = 3; 1919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_init(&mRequestCond, NULL); 1939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 19474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = -1; 195e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_init(&mMutex, NULL); 19633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 19733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 19833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mDefaultMetadata[i] = NULL; 19999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan 20099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 20199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) { 20299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID); 20399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 20499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 21066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface 211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 218d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 219d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* We need to stop all streams before deleting any stream */ 220d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab /*flush the metadata list*/ 221d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!mStoredMetadataList.empty()) { 222d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 223d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 224d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 225d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 226d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 227d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 228d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 2291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 2301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 2311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 232dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (channel) 2337ee407aa1024789089aad411c372c79423699976Ajay Dudani channel->stop(); 234d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang } 235d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 236d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang it != mStreamInfo.end(); it++) { 237d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 238dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (channel) 239dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang delete channel; 2401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free (*it); 2411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 2421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 2437ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel = NULL; 2447ee407aa1024789089aad411c372c79423699976Ajay Dudani 24597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (mJpegSettings != NULL) { 24697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole free(mJpegSettings); 24797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mJpegSettings = NULL; 24897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 249dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 250dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang /* Clean up all channels */ 251dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (mCameraInitialized) { 252020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava mMetadataChannel->stop(); 253020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava delete mMetadataChannel; 254020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava mMetadataChannel = NULL; 255dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang deinitParameters(); 256dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang } 257dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 258cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraOpened) 259cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang closeCamera(); 260e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 26133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 26233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (mDefaultMetadata[i]) 26333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang free_camera_metadata(mDefaultMetadata[i]); 26433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 265e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_cond_destroy(&mRequestCond); 266e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 267e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mMutex); 268d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 286cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 287cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraSessionActive) { 288cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang ALOGE("%s: multiple simultaneous camera instance not supported", __func__); 289cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 290cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang return INVALID_OPERATION; 291cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } 292cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 299cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (rc == 0) { 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 301cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 1; 302cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } else 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 304cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 30599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 30699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == 0) { 30799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 30899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 30999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 31099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=1"); 31199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 31299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 31399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 31499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 315cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 36699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 36799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == NO_ERROR) { 36899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 36999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 37099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 37199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=0"); 37299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 37399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 37499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 37599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 37699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan 377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 396e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 397e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 39833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang rc = initParameters(); 39933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (rc < 0) { 40033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang ALOGE("%s: initParamters failed %d", __func__, rc); 40133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang goto err1; 40233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } 403020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava //Create metadata channel and initialize it 404020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 405020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava mCameraHandle->ops, captureResultCb, 406020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava &gCamCapability[mCameraId]->padding_info, this); 407020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava if (mMetadataChannel == NULL) { 408020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava ALOGE("%s: failed to allocate metadata channel", __func__); 409020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava rc = -ENOMEM; 410020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava goto err2; 411020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava } 412020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava rc = mMetadataChannel->initialize(); 413020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava if (rc < 0) { 414020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava ALOGE("%s: metadata channel initialization failed", __func__); 415020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava goto err3; 416020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava } 417020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava 4189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCallbackOps = callback_ops; 419e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 420e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 421cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraInitialized = true; 4229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 4239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 424020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastavaerr3: 425020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava delete mMetadataChannel; 426020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava mMetadataChannel = NULL; 427020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastavaerr2: 428020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava deinitParameters(); 4299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1: 430e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 4319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 44933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int rc = 0; 450d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mIsZslMode = false; 4510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_lock(&mMutex); 452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 455e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 461e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 468e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 470625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *inputStream = NULL; 473c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang camera3_stream_t *jpegStream = NULL; 4740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /* first invalidate all the steams in the mStreamList 4750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * if they appear again, they will be validated */ 4761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 478d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 479d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang channel->stop(); 4800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = INVALID; 4810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 482d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 485c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d", 486c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, newStream->stream_type, newStream->format, 487c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang newStream->width, newStream->height); 4880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //if the stream is in the mStreamList validate it 4890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole bool stream_exists = false; 4901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 4920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if ((*it)->stream == newStream) { 4931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = 4941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (QCamera3Channel*)(*it)->stream->priv; 4950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_exists = true; 4960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = RECONFIGURE; 4971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*delete the channel object associated with the stream because 4981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole we need to reconfigure*/ 4991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 5001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->stream->priv = NULL; 5010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (!stream_exists) { 5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //new stream 5050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info_t* stream_info; 5060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info = (stream_info_t* )malloc(sizeof(stream_info_t)); 5070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->stream = newStream; 5080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->status = VALID; 5091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole stream_info->registered = 0; 5100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mStreamInfo.push_back(stream_info); 5110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 512c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT 513c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) { 514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 516e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 521c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->format == HAL_PIXEL_FORMAT_BLOB) { 522c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream = newStream; 523c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 5270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /*clean up invalid streams*/ 5281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 5291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end();) { 5300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if(((*it)->status) == INVALID){ 5311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 5321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 5330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole delete[] (buffer_handle_t*)(*it)->buffer_set.buffers; 5340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole free(*it); 5351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it = mStreamInfo.erase(it); 5361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 5371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it++; 5380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 541020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava //mMetadataChannel->stop(); 542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 549f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_INPUT: 550f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 551f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 552f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_BIDIRECTIONAL: 553f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 554f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab GRALLOC_USAGE_HW_CAMERA_WRITE; 555f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 556f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_OUTPUT: 557c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /* For video encoding stream, set read/write rarely 558c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * flag so that they may be set to un-cached */ 559c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) 560c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang newStream->usage = 561c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang (GRALLOC_USAGE_SW_READ_RARELY | 562c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang GRALLOC_USAGE_SW_WRITE_RARELY | 563c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang GRALLOC_USAGE_HW_CAMERA_WRITE); 564c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang else 565c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 566f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 567f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 568f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 569f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 5731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 576f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 5778867984d33ed870071109a4500402dddbc85c048Shuzhen Wang case HAL_PIXEL_FORMAT_YCbCr_420_888: 578f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 579c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 580c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream) { 581c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t width = jpegStream->width; 582c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t height = jpegStream->height; 5838bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode = true; 584c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 585c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mCameraHandle->ops, captureResultCb, 586c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this, newStream, 587c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang width, height); 588c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else 589c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 590f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 591f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 592f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 593f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 594f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 595f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 596f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 597f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 598f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 599f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 600f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_BLOB: 601f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 6027ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle, 603f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 604f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 6057ee407aa1024789089aad411c372c79423699976Ajay Dudani if (mPictureChannel == NULL) { 606f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 607f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 608f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 609f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 6107ee407aa1024789089aad411c372c79423699976Ajay Dudani newStream->priv = (QCamera3Channel*)mPictureChannel; 611f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 612f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 613f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab //TODO: Add support for app consumed format? 614f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 615f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 616f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 617625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 618625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 6248867984d33ed870071109a4500402dddbc85c048Shuzhen Wang /*For the streams to be reconfigured we need to register the buffers 6251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole since the framework wont*/ 6261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 6271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 6281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->status == RECONFIGURE) { 6291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 6301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*only register buffers for streams that have already been 6311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole registered*/ 6321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->registered) { 6331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = channel->registerBuffers((*it)->buffer_set.num_buffers, 6341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers); 6351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (rc != NO_ERROR) { 6361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Failed to register the buffers of old stream,\ 6371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = %d", __func__, rc); 6381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 639a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: channel %p has %d buffers", 640e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, channel, (*it)->buffer_set.num_buffers); 6410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream); 6451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (index == NAME_NOT_FOUND) { 6461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.add((*it)->stream, 0); 6471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 6481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueAt(index) = 0; 6491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 6500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Initialize mPendingRequestInfo and mPendnigBuffersMap */ 6531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.clear(); 6541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 655d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab /*flush the metadata list*/ 656d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!mStoredMetadataList.empty()) { 657d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 658d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 659d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 660d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 661d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 662d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 663d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 664d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab 66533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang //settings/parameters don't carry over for new configureStreams 6669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 66733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest = true; 66833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 66962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Get min frame duration for this streams configuration 67062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang deriveMinFrameDuration(); 67162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 67333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return rc; 674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 677e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : validateCaptureRequest 678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 679e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service 68080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 68180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 68280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 68380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 68480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 68580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 68680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 687e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest( 6889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 68980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 6909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 6919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 6929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 6959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 6969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 6979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 7039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 7049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 7059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 7089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 713c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang b = request->input_buffer; 714c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel *channel = 715c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 716c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (channel == NULL) { 717c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 718c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 719c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 720c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 721c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 722c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 723c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 724c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 725c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 726c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->release_fence != -1) { 727c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 728c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 729c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 730c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 731c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->buffer == NULL) { 732c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 733c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 734c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 735c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 7369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 7399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 7409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 7419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 7429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 7439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 7449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 7459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 7499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 7509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 7549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 7559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 7599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 7609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 7649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 7659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 7669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 768e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 769e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 770e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 77162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION : deriveMinFrameDuration 77262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 77362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: derive mininum processed, jpeg, and raw frame durations based 77462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * on currently configured streams. 77562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 77662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : NONE 77762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 77862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN : NONE 77962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 78062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/ 78162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangvoid QCamera3HardwareInterface::deriveMinFrameDuration() 78262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{ 78362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t maxJpegDimension, maxProcessedDimension; 78462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 78562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxJpegDimension = 0; 78662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = 0; 78762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 78862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang // Figure out maximum jpeg, processed, and raw dimensions 78962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (List<stream_info_t*>::iterator it = mStreamInfo.begin(); 79062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang it != mStreamInfo.end(); it++) { 79162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 79262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang // Input stream doesn't have valid stream_type 79362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if ((*it)->stream->stream_type == CAMERA3_STREAM_INPUT) 79462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang continue; 79562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 79662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t dimension = (*it)->stream->width * (*it)->stream->height; 79762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if ((*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) { 79862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (dimension > maxJpegDimension) 79962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxJpegDimension = dimension; 80062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } else if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_SENSOR) { 80162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (dimension > maxProcessedDimension) 80262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = dimension; 80362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 80462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 80562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 80662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Assume all jpeg dimensions are in processed dimensions. 80762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (maxJpegDimension > maxProcessedDimension) 80862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = maxJpegDimension; 80962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 81062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Find minimum durations for processed, jpeg, and raw 81162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinRawFrameDuration = gCamCapability[mCameraId]->raw_min_duration; 81262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 81362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (maxProcessedDimension == 81462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang gCamCapability[mCameraId]->picture_sizes_tbl[i].width * 81562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang gCamCapability[mCameraId]->picture_sizes_tbl[i].height) { 81662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinProcessedFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i]; 81762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinJpegFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i]; 81862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang break; 81962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 82062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 82162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang} 82262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 82362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*=========================================================================== 82462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION : getMinFrameDuration 82562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 82662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: get minimum frame draution based on the current maximum frame durations 82762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * and current request configuration. 82862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 82962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : @request: requset sent by the frameworks 83062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 83162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN : min farme duration for a particular request 83262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 83362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/ 83462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint64_t QCamera3HardwareInterface::getMinFrameDuration(const camera3_capture_request_t *request) 83562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{ 83662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang bool hasJpegStream = false; 83762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (uint32_t i = 0; i < request->num_output_buffers; i ++) { 83862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang const camera3_stream_t *stream = request->output_buffers[i].stream; 83962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (stream->format == HAL_PIXEL_FORMAT_BLOB) 84062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang hasJpegStream = true; 84162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 84262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 84362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (!hasJpegStream) 84462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return MAX(mMinRawFrameDuration, mMinProcessedFrameDuration); 84562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang else 84662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return MAX(MAX(mMinRawFrameDuration, mMinProcessedFrameDuration), mMinJpegFrameDuration); 84762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang} 84862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 84962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*=========================================================================== 850e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : registerStreamBuffers 851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 853e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 854e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 855e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @stream_list : streams to be configured 856e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 857e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 858e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 859e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 860e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 861e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 862e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 863e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = 0; 864e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 865e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 866e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 867e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set == NULL) { 868e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 869e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 870e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->stream == NULL) { 873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 877e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->num_buffers < 1) { 878e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 879e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 880e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 881e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 882e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->buffers == NULL) { 883e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 884e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 885e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 886e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 887e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 889e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 890e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 8910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //set the buffer_set in the mStreamInfo array 8921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 8931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 8941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->stream == stream) { 8950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint32_t numBuffers = buffer_set->num_buffers; 8961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.stream = buffer_set->stream; 8971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.num_buffers = numBuffers; 8981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers]; 8991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->buffer_set.buffers == NULL) { 9000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Failed to allocate buffer_handle_t*", __func__); 9010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_unlock(&mMutex); 9020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole return -ENOMEM; 9030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (size_t j = 0; j < numBuffers; j++){ 9051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers[j] = buffer_set->buffers[j]; 9060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->registered = 1; 9080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 910e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 911e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 912e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 913e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 914e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENODEV; 915e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 916e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 917e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 918e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 919e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 920e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 921e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 922e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : processCaptureRequest 923e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 924e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service 925e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 926e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 927e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @request : request from framework to process 928e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 929e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 930e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 931e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 932e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 933e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_request_t *request) 934e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 935e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = NO_ERROR; 93674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id; 937e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata meta; 938d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo reproc_meta; 939d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int queueMetadata = 0; 940e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 941e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 9432123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang rc = validateCaptureRequest(request); 9442123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang if (rc != NO_ERROR) { 9452123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang ALOGE("%s: incoming request is not valid", __func__); 9462123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang pthread_mutex_unlock(&mMutex); 9472123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang return rc; 9482123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang } 9492123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9502123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang meta = request->settings; 9512123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9522123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang // For first capture request, send capture intent, and 9532123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang // stream on all streams 954d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang if (mFirstRequest) { 9552123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9562123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 9572123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang int32_t hal_version = CAM_HAL_V3; 9582123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang uint8_t captureIntent = 9592123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 9602123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9612123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 9622123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 9632123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 9642123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang sizeof(hal_version), &hal_version); 9652123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 9662123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang sizeof(captureIntent), &captureIntent); 9672123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, 9682123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mParameters); 9692123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang } 9702123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 971d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 972d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang it != mStreamInfo.end(); it++) { 973d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 974d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang channel->start(); 975d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang } 976d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang } 977d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang 978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frameNumber = request->frame_number; 97934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy uint32_t streamTypeMask = 0; 9809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 98174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab if (meta.exists(ANDROID_REQUEST_ID)) { 98274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0]; 98374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = request_id; 984013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Received request with id: %d",__func__, request_id); 98574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else if (mFirstRequest || mCurrentRequestId == -1){ 98674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab ALOGE("%s: Unable to find request id field, \ 98774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab & no previous id available", __func__); 98874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab return NAME_NOT_FOUND; 98974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else { 990013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Re-using old request id", __func__); 99174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = mCurrentRequestId; 99274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } 99374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 994d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d", 995c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, __LINE__, 996c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->num_output_buffers, 997c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer, 998c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang frameNumber); 999e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // Acquire all request buffers first 10007ee407aa1024789089aad411c372c79423699976Ajay Dudani int blob_request = 0; 1001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 1002e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 100334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 1004e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang sp<Fence> acquireFence = new Fence(output.acquire_fence); 100566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 100666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 100766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Call function to store local copy of jpeg data for encode params. 10087ee407aa1024789089aad411c372c79423699976Ajay Dudani blob_request = 1; 100966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = getJpegSettings(request->settings); 101066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (rc < 0) { 10110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: failed to get jpeg parameters", __func__); 101266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pthread_mutex_unlock(&mMutex); 101366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 101466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 101566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 101666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1017e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 1018e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != OK) { 1019e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: fence wait failed %d", __func__, rc); 1020e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1021e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 1022e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 102334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy streamTypeMask |= channel->getStreamTypeMask(); 102434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy } 102534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy 102662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = setFrameParameters(request, streamTypeMask); 102734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy if (rc < 0) { 102834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy ALOGE("%s: fail to set frame parameters", __func__); 102934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy pthread_mutex_unlock(&mMutex); 103034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy return rc; 1031e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1032e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 10331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Update pending request list and pending buffers map */ 10341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole PendingRequestInfo pendingRequest; 10351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.frame_number = frameNumber; 10361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.num_buffers = request->num_output_buffers; 103774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab pendingRequest.request_id = request_id; 10387ee407aa1024789089aad411c372c79423699976Ajay Dudani pendingRequest.blob_request = blob_request; 103913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab pendingRequest.input_buffer_present = (request->input_buffer != NULL)? 1 : 0; 104074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 10411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < request->num_output_buffers; i++) { 10421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole RequestedBufferInfo requestedBuf; 10431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.stream = request->output_buffers[i].stream; 10441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.buffer = NULL; 10451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.buffers.push_back(requestedBuf); 10461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(requestedBuf.stream)++; 10481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.push_back(pendingRequest); 10501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 1052e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMetadataChannel->request(NULL, frameNumber); 10539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 10549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 10559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 10569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 10579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 1058c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mm_camera_buf_def_t *pInputBuffer = NULL; 105966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 10609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 10619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 10629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 10639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 10649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 106566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 1066c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3RegularChannel* inputChannel = NULL; 1067c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(request->input_buffer != NULL){ 1068c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang //Try to get the internal format 1069c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel = (QCamera3RegularChannel*) 1070c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->stream->priv; 1071c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(inputChannel == NULL ){ 1072c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: failed to get input channel handle", __func__); 1073c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else { 1074c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer = 1075c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel->getInternalFormatBuffer( 1076c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->buffer); 1077c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("%s: Input buffer dump",__func__); 1078c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("Stream id: %d", pInputBuffer->stream_id); 1079c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("streamtype:%d", pInputBuffer->stream_type); 1080c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("frame len:%d", pInputBuffer->frame_len); 108141da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab ALOGD("Handle:%p", request->input_buffer->buffer); 1082d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //TODO: need to get corresponding metadata and send it to pproc 1083d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1084d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 1085d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->zsl_buf_hdl == request->input_buffer->buffer) { 1086d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab reproc_meta.meta_buf = m->meta_buf; 1087d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab queueMetadata = 1; 1088d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1089d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1090d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1091c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1092c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1093c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang rc = channel->request(output.buffer, frameNumber, mJpegSettings, 1094c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer,(QCamera3Channel*)inputChannel); 1095d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (queueMetadata) { 109641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(reproc_meta.meta_buf,mMetadataChannel,false); 1097d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 109866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 1099d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: %d, request with buffer %p, frame_number %d", __func__, 1100a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab __LINE__, output.buffer, frameNumber); 1101d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (mIsZslMode && output.stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1102d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1103d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 1104d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (uint32_t j = 0; j < request->num_output_buffers; j++) { 1105d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->zsl_buf_hdl == request->output_buffers[j].buffer) { 1106d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 1107d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 1108d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 1109d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1110d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1111d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1112d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1113d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 111466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = channel->request(output.buffer, frameNumber); 111566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 11169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 11179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 11189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 11199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 11201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mFirstRequest = false; 11211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 11229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 11239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 1; 11249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang while (mPendingRequest == 1) { 11255b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_cond_wait(&mRequestCond, &mMutex); 11269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 11279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1128e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 112980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 113080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 113180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 11329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 1133e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : getMetadataVendorTagOps 11349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 1135e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 11369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 11379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 1138e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1139e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1140e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1141e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1142b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps( 1143b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang vendor_tag_query_ops_t* /*ops*/) 1144e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1145e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Enable locks when we eventually add Vendor Tags */ 1146e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 1147e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1148e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1149e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1150e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 1151e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1152e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1153e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1154e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1155e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : dump 1156e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1157e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 1158e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1159e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1160e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1161e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1162e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1163e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1164b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/) 1165e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1166e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /*Enable lock when we implement this function*/ 1167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 1168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1169e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1171e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 1172e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1173e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1174e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1175c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*=========================================================================== 1176c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION : flush 1177c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1178c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION: 1179c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1180c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS : 1181c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1182c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1183c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN : 1184c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/ 1185c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush() 1186c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{ 1187c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /*Enable lock when we implement this function*/ 1188c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /* 1189c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang pthread_mutex_lock(&mMutex); 1190c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 1191c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang pthread_mutex_unlock(&mMutex); 1192c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang */ 1193c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return 0; 1194c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang} 11957ee407aa1024789089aad411c372c79423699976Ajay Dudani 1196e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1197e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 1198e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 119933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result 120033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * (streams, as well as metadata) 1201e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1202e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1203e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @metadata : metadata information 120433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. 120533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * NULL if metadata. 12069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 12079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 12089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 12091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf, 1210e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 12119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 12125b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_lock(&mMutex); 1213e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 12141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (metadata_buf) { 12151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer; 121633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int32_t frame_number_valid = *(int32_t *) 121733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata); 1218152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang uint32_t pending_requests = *(uint32_t *)POINTER_OF( 1219152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang CAM_INTF_META_PENDING_REQUESTS, metadata); 122033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang uint32_t frame_number = *(uint32_t *) 122133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata); 12220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole const struct timeval *tv = (const struct timeval *) 12230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata); 12240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC + 12250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole tv->tv_usec * NSEC_PER_USEC; 12260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 12271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!frame_number_valid) { 1228a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: Not a valid frame number, used as SOF only", __func__); 12291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->bufDone(metadata_buf); 12301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole goto done_metadata; 12311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1232a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__, 1233e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang frame_number, capture_time); 12341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 12351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Go through the pending requests info and send shutter/results to frameworks 12361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1237e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i != mPendingRequestsList.end() && i->frame_number <= frame_number;) { 12381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 12391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_notify_msg_t notify_msg; 1240a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number); 12411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 12421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Flush out all entries with less or equal frame numbers. 12431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 1244e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: Make sure shutter timestamp really reflects shutter timestamp. 1245e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //Right now it's the same as metadata timestamp 1246e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 1247e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: When there is metadata drop, how do we derive the timestamp of 1248e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //dropped frames? For now, we fake the dropped timestamp by substracting 1249e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //from the reported timestamp 1250e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang nsecs_t current_capture_time = capture_time - 1251e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang (frame_number - i->frame_number) * NSEC_PER_33MSEC; 1252e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 12531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send shutter notify to frameworks 12541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.type = CAMERA3_MSG_SHUTTER; 12551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.message.shutter.frame_number = i->frame_number; 1256e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang notify_msg.message.shutter.timestamp = current_capture_time; 12571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1258a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__, 1259e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i->frame_number, capture_time); 12601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 12611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send empty metadata with already filled buffers for dropped metadata 12621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // and send valid metadata with already filled buffers for current metadata 12631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i->frame_number < frame_number) { 126499b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang CameraMetadata dummyMetadata; 126599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP, 1266e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ¤t_capture_time, 1); 126799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_REQUEST_ID, 126874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab &(i->request_id), 1); 126999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang result.result = dummyMetadata.release(); 12701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 1271e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.result = translateCbMetadataToResultMetadata(metadata, 127274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab current_capture_time, i->request_id); 1273d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (mIsZslMode) { 1274d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int found_metadata = 0; 1275d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //for ZSL case store the metadata buffer and corresp. ZSL handle ptr 1276d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1277d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab j != i->buffers.end(); j++) { 1278d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (j->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1279d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //check if corresp. zsl already exists in the stored metadata list 1280d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1281d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.begin(); m++) { 1282d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->frame_number == frame_number) { 1283d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m->meta_buf = metadata_buf; 1284d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found_metadata = 1; 1285d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1286d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1287d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1288d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found_metadata) { 1289d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo store_meta_info; 1290d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab store_meta_info.meta_buf = metadata_buf; 1291d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab store_meta_info.frame_number = frame_number; 1292d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mStoredMetadataList.push_back(store_meta_info); 1293d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found_metadata = 1; 1294d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1295d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1296d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1297d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found_metadata) { 129813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab if (!i->input_buffer_present && i->blob_request) { 129913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab //livesnapshot or fallback non-zsl snapshot case 130013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 130113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab j != i->buffers.end(); j++){ 130213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab if (j->stream->stream_type == CAMERA3_STREAM_OUTPUT && 130313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab j->stream->format == HAL_PIXEL_FORMAT_BLOB) { 130441da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true); 130513c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab break; 130613c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 130713c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 130813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } else { 130913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab //return the metadata immediately 131013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab mMetadataChannel->bufDone(metadata_buf); 131113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab free(metadata_buf); 131213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 1313d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1314d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else if (!mIsZslMode && i->blob_request) { 13157ee407aa1024789089aad411c372c79423699976Ajay Dudani //If it is a blob request then send the metadata to the picture channel 131641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true); 1317d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else { 13187ee407aa1024789089aad411c372c79423699976Ajay Dudani // Return metadata buffer 13197ee407aa1024789089aad411c372c79423699976Ajay Dudani mMetadataChannel->bufDone(metadata_buf); 13207ee407aa1024789089aad411c372c79423699976Ajay Dudani free(metadata_buf); 1321d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1322d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab 13231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result.result) { 13251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: metadata is NULL", __func__); 13261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.frame_number = i->frame_number; 13281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 0; 1329e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.output_buffers = NULL; 13301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1331e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 13321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 13331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers++; 13341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 13371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (result.num_output_buffers > 0) { 13381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_stream_buffer_t *result_buffers = 13391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole new camera3_stream_buffer_t[result.num_output_buffers]; 13401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result_buffers) { 13411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Fatal error: out of memory", __func__); 13421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole size_t result_buffers_idx = 0; 13441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1345e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 13461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 13471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result_buffers[result_buffers_idx++] = *(j->buffer); 13481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free(j->buffer); 134913dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang j->buffer = NULL; 13501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(j->stream)--; 13511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = result_buffers; 13541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 13551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1356a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: meta frame_number = %d, capture_time = %lld", 1357d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 13581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 13591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete[] result_buffers; 13601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 13611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1362d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: meta frame_number = %d, capture_time = %lld", 1363d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 13641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 13651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // erase the element from the list 13671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i = mPendingRequestsList.erase(i); 13681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 136933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 137033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 13711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata: 13721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole bool max_buffers_dequeued = false; 13731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < mPendingBuffersMap.size(); i++) { 13741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i); 1375e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang uint32_t queued_buffers = mPendingBuffersMap.valueAt(i); 13761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (queued_buffers == stream->max_buffers) { 13771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole max_buffers_dequeued = true; 13781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole break; 13791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1381152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang if (!max_buffers_dequeued && !pending_requests) { 13821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Unblock process_capture_request 13831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequest = 0; 13841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_cond_signal(&mRequestCond); 13851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 13871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // If the frame number doesn't exist in the pending request list, 13881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // directly send the buffer to the frameworks, and update pending buffers map 13891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Otherwise, book-keep the buffer. 13901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1391c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang while (i != mPendingRequestsList.end() && i->frame_number != frame_number){ 13921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i++; 1393c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 13941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i == mPendingRequestsList.end()) { 13951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Verify all pending requests frame_numbers are greater 13961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin(); 1397e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != mPendingRequestsList.end(); j++) { 13981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->frame_number < frame_number) { 13991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: pending frame number %d is smaller than %d", 14001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole __func__, j->frame_number, frame_number); 14011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 14041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.result = NULL; 140533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang result.frame_number = frame_number; 14061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 1; 14071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = buffer; 1408a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: result frame_number = %d, buffer = %p", 1409e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, frame_number, buffer); 14101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(buffer->stream)--; 1411d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (buffer->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1412d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int found = 0; 1413d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator k = mStoredMetadataList.begin(); 1414d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab k != mStoredMetadataList.end(); k++) { 1415d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (k->frame_number == frame_number) { 1416d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab k->zsl_buf_hdl = buffer->buffer; 1417d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found = 1; 1418d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1419d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1420d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1421d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found) { 1422d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo meta_info; 1423d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab meta_info.frame_number = frame_number; 1424d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab meta_info.zsl_buf_hdl = buffer->buffer; 1425d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mStoredMetadataList.push_back(meta_info); 1426d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1427d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1428e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 142933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } else { 14301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1431e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 14321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->stream == buffer->stream) { 14331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer != NULL) { 14341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: buffer is already set", __func__); 14351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 14361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole j->buffer = (camera3_stream_buffer_t *)malloc( 14371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(camera3_stream_buffer_t)); 14381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole *(j->buffer) = *buffer; 1439a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: cache buffer %p at result frame_number %d", 1440e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, buffer, frame_number); 14411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1444e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 14459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 14465b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_unlock(&mMutex); 14479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 14489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 14499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 145097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 145197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : translateCbMetadataToResultMetadata 145297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 145397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: 145497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 145597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 145697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @metadata : metadata information from callback 145797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 145897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN : camera_metadata_t* 145997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * metadata in a format specified by fwk 146097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 146197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* 146297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata 146374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab (metadata_buffer_t *metadata, nsecs_t timestamp, 146474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id) 146597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 146697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata camMetadata; 146797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camera_metadata_t* resultMetadata; 146897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 14690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); 147074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1); 147197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 147297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_HISTOGRAM - TODO*/ 147397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*cam_hist_stats_t *histogram = 147497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM, 147597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole metadata);*/ 147697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 147797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*face detection*/ 147897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *) 147997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata); 148097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t numFaces = faceDetectionInfo->num_faces_detected; 148197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceIds[numFaces]; 148297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t faceScores[numFaces]; 148397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceRectangles[numFaces * 4]; 148497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceLandmarks[numFaces * 6]; 148597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int j = 0, k = 0; 148697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < numFaces; i++) { 148797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceIds[i] = faceDetectionInfo->faces[i].face_id; 148897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceScores[i] = faceDetectionInfo->faces[i].score; 148959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(faceDetectionInfo->faces[i].face_boundary, 149097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles+j, -1); 149197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k); 149297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole j+= 4; 149397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole k+= 6; 149497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 149599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang if (numFaces > 0) { 149699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces); 149799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces); 149899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES, 149997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles, numFaces*4); 150099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS, 150197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceLandmarks, numFaces*6); 150299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang } 150397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15048867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t *color_correct_mode = 15050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata); 150697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1); 150797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 150897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *ae_precapture_id = 150997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata); 151097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1); 151197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 151297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*aec regions*/ 151397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAeRegions = 151497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata); 151597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t aeRegions[5]; 151659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight); 151797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5); 151813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab 151913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab uint8_t *ae_state = 15208bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata); 152113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1); 152213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab 15230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *focusMode = 15240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata); 152597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1); 152697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 152797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*af regions*/ 152897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAfRegions = 152997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata); 153097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t afRegions[5]; 153159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight); 153297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5); 153397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata); 153597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1); 153697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 153797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *afTriggerId = 153897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata); 153997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1); 154097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalance = 15420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata); 154397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1); 154497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 154597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*awb regions*/ 154697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAwbRegions = 154797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata); 154897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t awbRegions[5]; 154959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight); 155097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5); 155197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalanceState = 15530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata); 155497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1); 155597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata); 155797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_MODE, mode, 1); 155897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1559d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE_MODE, metadata); 156097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1); 156197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashPower = 15630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata); 156497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1); 156597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 156697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *flashFiringTime = 156797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata); 156897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1); 156997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 157097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *ledMode = 157197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata); 157297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/ 157397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashState = 15750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata); 157697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_STATE, flashState, 1); 157797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *hotPixelMode = 15790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata); 158097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1); 158197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 158297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *lensAperture = 158397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata); 158497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1); 158597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 158697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *filterDensity = 158797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata); 158897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1); 158997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 159097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focalLength = 159197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata); 159297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1); 159397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 159497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusDistance = 159597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata); 159697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1); 159797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 159897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusRange = 159997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata); 160097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1); 160197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *opticalStab = 16030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata); 16040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1); 160597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 160697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *focusState = 160797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata); 160897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */ 160997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *noiseRedMode = 16110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata); 161297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1); 161397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 161497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_SCALER_CROP_REGION - check size*/ 161597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_crop_region_t *hScalerCropRegion =(cam_crop_region_t *) 161797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata); 161871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t scalerCropRegion[4]; 16190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[0] = hScalerCropRegion->left; 16200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[1] = hScalerCropRegion->top; 16210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[2] = hScalerCropRegion->width; 162271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropRegion[3] = hScalerCropRegion->height; 162371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4); 162497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 162597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorExpTime = 162697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata); 16270b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi mMetadataResponse.exposure_time = *sensorExpTime; 162862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: sensorExpTime = %lld", __func__, *sensorExpTime); 162997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1); 163097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 163197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorFameDuration = 163297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata); 163362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: sensorFameDuration = %lld", __func__, *sensorFameDuration); 163497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1); 163597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 163697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *sensorSensitivity = 163797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata); 163862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: sensorSensitivity = %d", __func__, *sensorSensitivity); 16393fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mMetadataResponse.iso_speed = *sensorSensitivity; 164097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1); 164197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *shadingMode = 16430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata); 164497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1); 164597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *faceDetectMode = 16470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata); 16486990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t fwk_faceDetectMode = lookupFwkName(FACEDETECT_MODES_MAP, 16496990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]), 16506990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang *faceDetectMode); 16516990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1); 165297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *histogramMode = 16540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata); 165597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1); 165697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *sharpnessMapMode = 16580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata); 165997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 166097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole sharpnessMapMode, 1); 166197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 166297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/ 166397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_sharpness_map_t *sharpnessMap = (cam_sharpness_map_t *) 166497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata); 166597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP, 166697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t*)sharpnessMap->sharpness, 166797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT); 166897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1669d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *) 1670d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_LENS_SHADING_MAP, metadata); 1671d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height; 1672d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy int map_width = gCamCapability[mCameraId]->lens_shading_map_size.width; 1673d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP, 1674d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy (float*)lensShadingMap->lens_shading, 1675d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 4*map_width*map_height); 1676d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1677d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*) 1678d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata); 1679d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4); 1680d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1681d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*) 1682d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata); 1683d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM, 1684d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3); 1685d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1686d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*) 1687d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata); 1688d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS, 1689d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy predColorCorrectionGains->gains, 4); 1690d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1691d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*) 1692d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata); 1693d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM, 1694d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3); 1695d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1696d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t *blackLevelLock = (uint8_t*) 1697d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata); 1698d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1); 1699d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1700d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t *sceneFlicker = (uint8_t*) 1701d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_SCENE_FLICKER, metadata); 1702d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1); 1703d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1704d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 170597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole resultMetadata = camMetadata.release(); 170633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return resultMetadata; 170797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 170897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 170997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 171059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertToRegions 171197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 171297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array 171397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 171497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 171597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @rect : cam_rect_t struct to convert 171697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @region : int32_t destination array 171797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @weight : if we are converting from cam_area_t, weight is valid 171897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * else weight = -1 171997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 172097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 172159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){ 172297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[0] = rect.left; 172397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[1] = rect.top; 172459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[2] = rect.left + rect.width; 172559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[3] = rect.top + rect.height; 172697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (weight > -1) { 172797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[4] = weight; 172897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 172997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 173059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 173159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*=========================================================================== 173259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertFromRegions 173359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 173459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t 173559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 173659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS : 173759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @rect : cam_rect_t struct to convert 173859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @region : int32_t destination array 173959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @weight : if we are converting from cam_area_t, weight is valid 174059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * else weight = -1 174159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 174259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/ 174359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi, 174459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang const camera_metadata_t *settings, 174559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang uint32_t tag){ 174659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang CameraMetadata frame_settings; 174759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang frame_settings = settings; 174859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_min = frame_settings.find(tag).data.i32[0]; 174959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_min = frame_settings.find(tag).data.i32[1]; 175059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_max = frame_settings.find(tag).data.i32[2]; 175159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_max = frame_settings.find(tag).data.i32[3]; 175259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->weight = frame_settings.find(tag).data.i32[4]; 175359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.left = x_min; 175459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.top = y_min; 175559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.width = x_max - x_min; 175659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.height = y_max - y_min; 175759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang} 175859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 175997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 176071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION : resetIfNeededROI 176171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 176271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler 176371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * crop region 176471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 176571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS : 176671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @roi : cam_area_t struct to resize 176771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @scalerCropRegion : cam_crop_region_t region to compare against 176871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 176971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 177071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/ 177171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi, 177271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang const cam_crop_region_t* scalerCropRegion) 177371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{ 177471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_x_max = roi->rect.width + roi->rect.left; 177571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_y_max = roi->rect.height + roi->rect.top; 177671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top; 177771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left; 177871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if ((roi_x_max < scalerCropRegion->left) || 177971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi_y_max < scalerCropRegion->top) || 178071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.left > crop_x_max) || 178171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.top > crop_y_max)){ 178271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return false; 178371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 178471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.left < scalerCropRegion->left) { 178571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.left = scalerCropRegion->left; 178671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 178771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.top < scalerCropRegion->top) { 178871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.top = scalerCropRegion->top; 178971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 179071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_x_max > crop_x_max) { 179171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_x_max = crop_x_max; 179271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 179371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_y_max > crop_y_max) { 179471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_y_max = crop_y_max; 179571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 179671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.width = roi_x_max - roi->rect.left; 179771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.height = roi_y_max - roi->rect.top; 179871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return true; 179971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang} 180071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang 180171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*=========================================================================== 180297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : convertLandmarks 180397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 180497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info 180597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 180697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 180797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @face : cam_rect_t struct to convert 180897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @landmarks : int32_t destination array 180997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 181097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 181197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 181297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks) 181397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 181497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[0] = face.left_eye_center.x; 181597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[1] = face.left_eye_center.y; 181697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[2] = face.right_eye_center.y; 181797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[3] = face.right_eye_center.y; 181897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[4] = face.mouth_center.x; 181997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[5] = face.mouth_center.y; 182097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 182197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 1823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 1825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 1827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 1833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 1834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 1836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 1838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 1839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 1840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 1842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 1843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 1844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 1845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 1846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1848e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 1849e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (capabilityHeap == NULL) { 1850e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: creation of capabilityHeap failed", __func__); 1851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang goto heap_creation_failed; 1852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 1854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 1855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 1856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 1857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 1858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 1861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 1862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 1863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 1864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 1865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 1868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 1869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 1872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 1873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 1875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 1878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 1879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 1880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 1883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 1885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 1887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 1888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 1889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 1890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 1891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 1892e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete capabilityHeap; 1893e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed: 1894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 1895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 1896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 1897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1901662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : initParameters 1902662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1903662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters 1904662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1905662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1906662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1907662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1908662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 1909662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1910662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1911662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters() 1912662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1913662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 1914662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1915662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Allocate Set Param Buffer 1916662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = new QCamera3HeapMemory(); 1917662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 1918662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc != OK) { 1919662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = NO_MEMORY; 1920662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("Failed to allocate SETPARM Heap memory"); 1921662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1922662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1923662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1925662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1926662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Map memory for parameters buffer 1927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 1928662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole CAM_MAPPING_BUF_TYPE_PARM_BUF, 1929662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->getFd(0), 1930662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(parm_buffer_t)); 1931662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc < 0) { 1932662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:failed to map SETPARM buffer",__func__); 1933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = FAILED_TRANSACTION; 1934662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->deallocate(); 1935662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1937662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0); 1941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 194533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION : deinitParameters 194633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 194733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters 194833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 194933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS : 195033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 195133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN : NONE 195233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/ 195333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters() 195433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{ 195533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 195633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF); 195733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 195833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap->deallocate(); 195933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang delete mParamHeap; 196033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap = NULL; 196133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 196233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters = NULL; 196333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang} 196433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 196533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*=========================================================================== 19660a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION : calcMaxJpegSize 19670a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 19680a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId 19690a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 19700a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS : 19710a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 19720a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN : max_jpeg_size 19730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/ 19740a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize() 19750a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{ 19760a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int32_t max_jpeg_size = 0; 19770a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int temp_width, temp_height; 19780a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 19790a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width; 19800a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height; 19810a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab if (temp_width * temp_height > max_jpeg_size ) { 19820a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = temp_width * temp_height; 19830a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 19840a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 19850a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 19860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab return max_jpeg_size; 19870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab} 19880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab 19890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*=========================================================================== 1990625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 1991625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 1993625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1997625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1998625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 1999625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 2000625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2001625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 2002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 200497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata staticInfo; 2005c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 2006c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang /* android.info: hardware level */ 2007c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL; 2008c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, 2009c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &supportedHardwareLevel, 1); 2010c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 2011662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK; 2012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 3 only*/ 20132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 20142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); */ 20152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2016e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang /*hard coded for now but this should come from sensor*/ 2017e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang float min_focus_distance; 2018e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if(facingBack){ 2019e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 10; 2020e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2021e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 0; 2022e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 20242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &min_focus_distance, 1); 2025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 2027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 2028625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2029c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*should be using focal lengths but sensor doesn't provide that info now*/ 2030625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 2031c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &gCamCapability[cameraId]->focal_length, 2032c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1); 2033625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2034625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 2035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 2036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 2037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 2039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 2040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 2041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 2044c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)gCamCapability[cameraId]->optical_stab_modes, 2045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 2046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 204780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 204880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 204980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 205080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 205147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 205280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 205380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 205480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 205580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 2056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 205747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 20580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->geo_correction_map_size.height}; 205980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 206080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 206180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 206280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 206380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 206480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 2065c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float)); 206680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 206780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 206880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 206980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 207080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 207180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 207280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 207380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 207480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 207580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 207680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 207780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 2078c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1); 207980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 208047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 208180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 208280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 208380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 208480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 208522817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t active_array_size[] = {0, 0, 208622817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala gCamCapability[cameraId]->active_array_size.width, 208780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 208880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 208922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala active_array_size, 4); 209080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 209180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 209280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 2093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 209480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 209580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 209680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 209780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 209880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 209980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 210080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 210180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 210280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 210380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 21046990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang (int*)&gCamCapability[cameraId]->max_num_roi, 1); 210580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 210680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 210780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 210880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 210980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 211080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 211180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 211247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 211380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 211480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 211580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 211680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 211780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 211880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 211980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 212080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 212180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 212280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 212380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 212480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 212580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 212622817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888, 212722817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB}; 212822817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t); 2129662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 2130662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats, 21318867984d33ed870071109a4500402dddbc85c048Shuzhen Wang scalar_formats_count); 2132662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 213347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_processed_sizes[CAM_FORMAT_MAX * 2]; 213400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang makeTable(gCamCapability[cameraId]->picture_sizes_tbl, 213500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt, 2136662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes); 2137662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2138662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes, 213900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2); 214000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 2141e936796df0426c326d043c2359c149024526f4bcShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, 214200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 214300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 21440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 214547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_fps_ranges[MAX_SIZES_CNT * 2]; 21460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl, 21470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->fps_ranges_tbl_cnt, 21480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole available_fps_ranges); 2149c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2150c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) ); 2151c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 215247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang camera_metadata_rational exposureCompensationStep = { 2153c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.numerator, 2154c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.denominator}; 2155c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 2156c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &exposureCompensationStep, 1); 2157c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2158c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*TO DO*/ 215947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF}; 2160c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 2161c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableVstabModes, sizeof(availableVstabModes)); 2162c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2163b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang /*HAL 1 and HAL 3 common*/ 21649443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab float maxZoom = 4; 2165c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 2166c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &maxZoom, 1); 2167c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 216847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max3aRegions = 1; 2169c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_MAX_REGIONS, 2170c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &max3aRegions, 1); 2171c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 217247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableFaceDetectModes[] = { 21736990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, 21746990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_FULL }; 2175c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 2176c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableFaceDetectModes, 2177c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(availableFaceDetectModes)); 2178c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 217947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width, 2180662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->raw_dim.height}; 2181662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 2182662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole raw_size, 2183662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(raw_size)/sizeof(uint32_t)); 2184662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 218547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 218680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 218780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 218880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 218980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 219080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 2191662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint8_t lensFacing = (facingBack) ? 219280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 219380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 2194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2195662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 219600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang available_processed_sizes, 2197c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2)); 2198c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2199c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 220008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab available_thumbnail_sizes, 220108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab sizeof(available_thumbnail_sizes)/sizeof(int32_t)); 2202662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 220347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max_jpeg_size = 0; 220497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int temp_width, temp_height; 220597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 220697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width; 220797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height; 220897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (temp_width * temp_height > max_jpeg_size ) { 220997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = temp_width * temp_height; 221097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 221197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 221297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 221397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole staticInfo.update(ANDROID_JPEG_MAX_SIZE, 221497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole &max_jpeg_size, 1); 221597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 221647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_effects[CAM_EFFECT_MODE_MAX]; 22170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t size = 0; 2218662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) { 22190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(EFFECT_MODES_MAP, 2220b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]), 22210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_effects[i]); 22220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 22230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_effects[size] = (uint8_t)val; 22240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 22250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2226662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2227662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 2228662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_effects, 22290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2230662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 223147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX]; 2232e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t supported_indexes[CAM_SCENE_MODE_MAX]; 22332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang int32_t supported_scene_modes_cnt = 0; 2234662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) { 22350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(SCENE_MODES_MAP, 2236b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 22370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_scene_modes[i]); 22380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 2239e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val; 2240e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_indexes[supported_scene_modes_cnt] = i; 22412dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt++; 22420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2243662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2244e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2245662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 2246662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_scene_modes, 22472dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt); 2248662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 224947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3]; 2250e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides, 2251e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt, 2252e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 22539443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supported_indexes, 22549443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab cameraId); 2255e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 2256e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 2257e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt*3); 2258e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 225947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX]; 22600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2261662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) { 22620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(ANTIBANDING_MODES_MAP, 2263b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 2264b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[cameraId]->supported_antibandings[i]); 22650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 22660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_antibanding_modes[size] = (uint8_t)val; 22670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 22680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 22690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2270662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 2272662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_antibanding_modes, 22730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2274662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 227547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX]; 22760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2277662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) { 22780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FOCUS_MODES_MAP, 2279b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 22800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_focus_modes[i]); 22810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 22820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_af_modes[size] = (uint8_t)val; 22830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 22840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2285662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2286662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 2287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_af_modes, 22880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2289662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 229047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_awb_modes[CAM_WB_MODE_MAX]; 22910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2292662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) { 22930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP, 2294b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 22950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_white_balances[i]); 22960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 22970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_awb_modes[size] = (uint8_t)val; 22980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 22990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2300662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2301662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 2302662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_awb_modes, 23030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2304662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2305a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX]; 2306a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++) 2307a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i]; 2308a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava 2309a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava staticInfo.update(ANDROID_FLASH_FIRING_POWER, 2310a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava available_flash_levels, 2311a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava gCamCapability[cameraId]->supported_flash_firing_level_cnt); 2312a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava 2313662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 231400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang uint8_t flashAvailable = gCamCapability[cameraId]->flash_available; 2315e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE, 2316e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang &flashAvailable, 1); 2317e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2318e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t avail_ae_modes[5]; 2319e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size = 0; 2320e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) { 2321e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i]; 2322e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size++; 2323e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2324e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (flashAvailable) { 2325e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; 2326e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; 2327e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; 2328e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2329662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 2330662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_ae_modes, 2331e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size); 2332ea44a483c0e98200c058a85ea339457616516847Zhijun He 2333e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t sensitivity_range[2]; 2334e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity; 2335e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity; 2336ea44a483c0e98200c058a85ea339457616516847Zhijun He staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, 2337ea44a483c0e98200c058a85ea339457616516847Zhijun He sensitivity_range, 2338ea44a483c0e98200c058a85ea339457616516847Zhijun He sizeof(sensitivity_range) / sizeof(int32_t)); 23392dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 234073c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, 234173c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy &gCamCapability[cameraId]->max_analog_sensitivity, 234200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 1); 234300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 234473c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 2345e936796df0426c326d043c2359c149024526f4bcShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 2346e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 234773c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy 234800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle; 234900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang staticInfo.update(ANDROID_SENSOR_ORIENTATION, 235000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang &sensor_orientation, 235100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 1); 235200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 235300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang int32_t max_output_streams[3] = {1, 3, 1}; 235400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, 235500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang max_output_streams, 235600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 3); 235700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 2358b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang gStaticMetadata[cameraId] = staticInfo.release(); 2359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2363662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : makeTable 2364662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2365662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes 2366662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2367662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2368662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2369662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2370662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2371662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size, 2372662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t* sizeTable) 2373662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2374662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int j = 0; 2375662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < size; i++) { 2376662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j] = dimTable[i].width; 2377662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j+1] = dimTable[i].height; 2378662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole j+=2; 2379662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2380662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 23810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 23820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*=========================================================================== 23830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : makeFPSTable 23840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 23850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges 23860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 23870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS : 23880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 23890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/ 23900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size, 2391c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang int32_t* fpsRangesTable) 23920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{ 23930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int j = 0; 23940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < size; i++) { 2395c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps; 2396c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps; 23970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole j+=2; 23980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 23990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole} 24002dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 24012dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*=========================================================================== 24022dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION : makeOverridesList 24032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides 24052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS : 24072dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/ 24102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable, 2411e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t size, uint8_t* overridesList, 24129443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t* supported_indexes, 24139443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int camera_id) 24142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{ 24152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*daemon will give a list of overrides for all scene modes. 24162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang However we should send the fwk only the overrides for the scene modes 24172dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported by the framework*/ 24189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int j = 0, index = 0, supt = 0; 24199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t focus_override; 24202dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang for (int i = 0; i < size; i++) { 24219443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 0; 2422e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang index = supported_indexes[i]; 2423e310738e63535838ed4659a55d540b75abc84c19Ajay Dudani overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON; 24249443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP, 24259443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 24269443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesTable[index].awb_mode); 24279443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override = (uint8_t)overridesTable[index].af_mode; 24289443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) { 24299443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) { 24309443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 1; 24319443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab break; 24329443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 24339443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 24349443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (supt) { 24359443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP, 24369443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 24379443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override); 24389443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } else { 24399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF; 24409443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 24412dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang j+=3; 24422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang } 24432dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang} 24442dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2445662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : getPreviewHalPixelFormat 2447662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2448662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework 2449662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2450662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend 2451662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN : format recognized by framework 2453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format) 2456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t halPixelFormat; 2458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole switch (format) { 2460662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV12: 2461662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; 2462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2463662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21: 2464662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2465662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2466662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21_ADRENO: 2467662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO; 2468662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2469662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_YV12: 2470662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YV12; 2471662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2472662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV16: 2473662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV61: 2474662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole default: 2475662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2476662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2478662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return halPixelFormat; 2479662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2480662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2481662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 24823fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION : getSensorSensitivity 24833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 24843fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value 24853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 24863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor 24873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 24883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN : sensitivity supported by sensor 24893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 24903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/ 24913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode) 24923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{ 24933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang int32_t sensitivity; 24943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 24953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang switch (iso_mode) { 24963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_100: 24973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 100; 24983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 24993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_200: 25003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 200; 25013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_400: 25033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 400; 25043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_800: 25063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 800; 25073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_1600: 25093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 1600; 25103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25113fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang default: 25123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = -1; 25133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25143fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 25153fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang return sensitivity; 25163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang} 25173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 25183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 25193fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*=========================================================================== 2520662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : AddSetParmEntryToBatch 2521662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2522662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch 2523662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2524662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @p_table : ptr to parameter buffer 2526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramType : parameter type 2527662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramLength : length of parameter value 2528662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramValue : ptr to parameter value 2529662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2530662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2531662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 2532662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2533662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2534662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table, 2535662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole cam_intf_parm_type_t paramType, 2536662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint32_t paramLength, 2537662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole void *paramValue) 2538662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2539662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int position = paramType; 2540662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int current, next; 2541662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Code to take care of linking next flags * 2544662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_FIRST_PARAM_ID(p_table); 2546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position == current){ 2547662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //DO NOTHING 2548662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else if (position < current){ 2549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, current); 2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_FIRST_PARAM_ID(p_table, position); 2551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 2552662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /* Search for the position in the linked list where we need to slot in*/ 2553662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole while (position > GET_NEXT_PARAM_ID(current, p_table)) 2554662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_NEXT_PARAM_ID(current, p_table); 2555662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2556662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*If node already exists no need to alter linking*/ 2557662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position != GET_NEXT_PARAM_ID(current, p_table)) { 2558662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole next = GET_NEXT_PARAM_ID(current, p_table); 2559662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(current, p_table, position); 2560662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, next); 2561662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2562662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2563662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2564662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2565662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Copy contents into entry * 2566662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2567662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2568662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (paramLength > sizeof(parm_type_t)) { 2569662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:Size of input larger than max entry size",__func__); 2570662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2571662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2572662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength); 2573662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NO_ERROR; 2574662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2575662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2576662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2577662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupFwkName 2578662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2579662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2580662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2581662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2582662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2583662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2584662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2585662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @hal_name : name of the hal_parm to map 2586662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2587662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int type of status 2588662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * fwk_name -- success 2589662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2590662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 25910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[], 2592662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int hal_name) 2593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2594662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2595d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (int i = 0; i < len; i++) { 2596d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang if (arr[i].hal_name == hal_name) 2597d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return arr[i].fwk_name; 2598662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2599d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 2600d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* Not able to find matching framework type is not necessarily 2601d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * an error case. This happens when mm-camera supports more attributes 2602d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * than the frameworks do */ 2603d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Cannot find matching framework type", __func__); 2604d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return NAME_NOT_FOUND; 2605662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2606662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2607662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2608662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupHalName 2609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2614662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @fwk_name : name of the hal_parm to map 2617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2618662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2619662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * hal_name -- success 2620662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 26220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[], 2623662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int fwk_name) 2624662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 2626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].fwk_name == fwk_name) 2627662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].hal_name; 2628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Cannot find matching hal type", __func__); 2630662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NAME_NOT_FOUND; 2631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 2635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 2637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 2641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 2644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 2645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 2647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 2648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 2650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 2652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 2653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 2655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2659b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang if (NULL == gStaticMetadata[cameraId]) { 2660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 2661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 2667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 2668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 2669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 2672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 2673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 2677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 2678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 2683c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang info->device_version = CAMERA_DEVICE_API_VERSION_3_0; 2684b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang info->static_camera_characteristics = gStaticMetadata[cameraId]; 2685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 2691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 2693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 2695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 2698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 2699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 270197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type) 2702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2703e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 2704e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 2706e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 2710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 271197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata settings; 2712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 2713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 2714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 2715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2716625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 2717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 2719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 2720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 2721625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 2722625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 2724625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 2725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 2727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 2728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 2730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 2731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 2733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 2734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 2737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 2740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 27419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 27429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 2743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 2745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 2746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2747625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 2748625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 2749625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 2751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 2752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 2754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 2755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 2757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 2758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 2760625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 2761625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2762e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t focusMode; 2763e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) { 2764e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to auto", __func__); 2765e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_AUTO; 2766e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2767e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to off", __func__); 2768e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_OFF; 2769e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 27702dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1); 27712dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 27722dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; 27732dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 27742dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 2776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 2777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 2778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2779a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4; 2780a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava settings.update(ANDROID_FLASH_FIRING_POWER, 2781a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava &flashFiringLevel, 1); 2782625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 278447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_aperture = gCamCapability[mCameraId]->apertures[0]; 2785625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 2786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2787b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang if (gCamCapability[mCameraId]->filter_densities_count) { 278847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 2789b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 2790b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[mCameraId]->filter_densities_count); 2791b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang } 2792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 27939a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang float default_focal_length = gCamCapability[mCameraId]->focal_length; 27949a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 2795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 279662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang /* frame duration */ 279762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int64_t default_frame_duration = NSEC_PER_33MSEC; 279862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang settings.update(ANDROID_SENSOR_FRAME_DURATION, &default_frame_duration, 1); 279962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 280062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang /* sensitivity */ 280162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t default_sensitivity = 100; 280262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1); 280362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 2804625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 2805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2810625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 281180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 281280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 281380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 281480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 281580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 281680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 281762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * @request : request that needs to be serviced 281834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * @streamTypeMask : bit mask of stream types on which buffers are requested 281980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 282080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 282180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 282280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 282362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(camera3_capture_request_t *request, 282462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang uint32_t streamTypeMask) 282580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 282680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 282780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 282862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (request->settings == NULL && mFirstRequest) { 282980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 283080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 2831662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 283233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2833b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 2834b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang 2835b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 283633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 283762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 2838b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(hal_version), &hal_version); 283962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (rc < 0) { 284062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGE("%s: Failed to set hal version in the parameters", __func__); 284162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return BAD_VALUE; 284262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 284333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2844662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*we need to update the frame number in the parameters*/ 2845662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 284662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang sizeof(request->frame_number), &(request->frame_number)); 2847662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (rc < 0) { 2848662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s: Failed to set the frame number in the parameters", __func__); 2849662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2850662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 28510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 285234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy /* Update stream id mask where buffers are requested */ 285334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK, 285434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy sizeof(streamTypeMask), &streamTypeMask); 285534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy if (rc < 0) { 285634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy ALOGE("%s: Failed to set stream type mask in the parameters", __func__); 285734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy return BAD_VALUE; 285834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy } 285934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy 286062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if(request->settings != NULL){ 286162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = translateMetadataToParameters(request); 286280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 286380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 2864662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 286580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 286680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 286780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 286880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 286980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 287080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 287180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 287280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 287380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 287480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 287562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * @request : request sent from framework 287680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 287780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 287880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 287980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 288080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 288180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 288262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang (const camera3_capture_request_t *request) 288380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 2884662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 288597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata frame_settings; 288662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang frame_settings = request->settings; 28870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) { 28890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t antibandingMode = 28900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0]; 28910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING, 28920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(antibandingMode), &antibandingMode); 28930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 289497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 289553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 2896e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t expCompensation = frame_settings.find( 2897e936796df0426c326d043c2359c149024526f4bcShuzhen Wang ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 2898fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min) 2899fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_compensation_min; 2900fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max) 2901fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_compensation_max; 290253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION, 290353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab sizeof(expCompensation), &expCompensation); 290453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 290553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab 29060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) { 29070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0]; 29080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK, 29090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeLock), &aeLock); 29100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) { 29120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_fps_range_t fps_range; 29130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.min_fps = 29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.max_fps = 29169443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1]; 29170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE, 29180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(fps_range), &fps_range); 29190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 292097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 29212b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang float focalDistance = -1.0; 29222b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) { 29232b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0]; 29242b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 29252b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang CAM_INTF_META_LENS_FOCUS_DISTANCE, 29262b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang sizeof(focalDistance), &focalDistance); 29272b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } 29282b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang 29290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) { 29302dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang uint8_t fwk_focusMode = 29310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0]; 29322b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang uint8_t focusMode; 29332b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) { 29342b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focusMode = CAM_FOCUS_MODE_INFINITY; 29352b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } else{ 29362b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focusMode = lookupHalName(FOCUS_MODES_MAP, 29372b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang sizeof(FOCUS_MODES_MAP), 29382b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang fwk_focusMode); 29392b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } 29400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE, 29410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focusMode), &focusMode); 29420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 29440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) { 29450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t awbLock = 29460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0]; 29470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK, 29480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(awbLock), &awbLock); 29490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) { 29520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_whiteLevel = 29530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0]; 29540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP, 29550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(WHITE_BALANCE_MODES_MAP), 29560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_whiteLevel); 29570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE, 29580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(whiteLevel), &whiteLevel); 29590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) { 29620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_effectMode = 29630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0]; 29640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP, 29650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(EFFECT_MODES_MAP), 29660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_effectMode); 29670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT, 29680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(effectMode), &effectMode); 29690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 29720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_aeMode = 29730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 2974e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t aeMode; 2975e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t redeye; 29766356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani 2977e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) { 2978e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_OFF; 2979e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2980e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_ON; 2981e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2982e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 2983e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 1; 2984e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2985e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 0; 2986e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 29876356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani 2988e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP, 2989e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(AE_FLASH_MODE_MAP), 2990f7d51831acde505c8cda8e60ab651b113326c6b7Shuzhen Wang fwk_aeMode); 29910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE, 29920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeMode), &aeMode); 2993e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 2994e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(flashMode), &flashMode); 2995e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION, 2996e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(redeye), &redeye); 29970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) { 30000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t colorCorrectMode = 30010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0]; 30020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = 30030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE, 30040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(colorCorrectMode), &colorCorrectMode); 30050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3006d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3007d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) { 3008d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_gains_t colorCorrectGains; 3009d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int i = 0; i < 4; i++) { 3010d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy colorCorrectGains.gains[i] = 3011d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i]; 3012d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3013d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = 3014d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_GAINS, 3015d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(colorCorrectGains), &colorCorrectGains); 3016d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3017d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3018d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) { 3019d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_matrix_t colorCorrectTransform; 3020d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_rational_type_t transform_elem; 3021d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy int num = 0; 3022d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int i = 0; i < 3; i++) { 3023d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 3; j++) { 3024d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy transform_elem.numerator = 3025d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator; 3026d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy transform_elem.denominator = 3027d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator; 3028d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy colorCorrectTransform.transform_matrix[i][j] = transform_elem; 3029d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy num++; 3030d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3031d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3032d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = 3033d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_TRANSFORM, 3034d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(colorCorrectTransform), &colorCorrectTransform); 3035d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3036d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3037e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang cam_trigger_t aecTrigger; 3038e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE; 3039e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger_id = -1; 30402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&& 30412dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) { 30422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger = 30430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0]; 30442dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger_id = 30452dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0]; 30460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, 30481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(aecTrigger), &aecTrigger); 30490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30502dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*af_trigger must come with a trigger id*/ 30512dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) && 30522dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) { 30532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang cam_trigger_t af_trigger; 30542dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger = 30550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0]; 30562dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger_id = 30572dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0]; 30580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 30592dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger); 30600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_MODE)) { 30630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0]; 30640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE, 30650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(metaMode), &metaMode); 30669443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) { 30679443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0]; 30689443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP, 30699443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 30709443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab fwk_sceneMode); 30719443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 3072827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab sizeof(sceneMode), &sceneMode); 3073827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab } else if (metaMode == ANDROID_CONTROL_MODE_OFF) { 3074827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 3075827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 3076827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab sizeof(sceneMode), &sceneMode); 3077827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) { 3078827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 3079827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 30809443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(sceneMode), &sceneMode); 30819443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 30820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) { 30850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t demosaic = 30860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0]; 30870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC, 30880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(demosaic), &demosaic); 30890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_MODE)) { 30920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 3093d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE_MODE, 30940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(edgeMode), &edgeMode); 30950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) { 30980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t edgeStrength = 30990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0]; 31000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 31010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength); 31020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 3104e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (frame_settings.exists(ANDROID_FLASH_MODE)) { 31056356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani int32_t respectFlashMode = 1; 31066356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 31076356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t fwk_aeMode = 31086356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 31096356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) { 31106356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani respectFlashMode = 0; 31116356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: AE Mode controls flash, ignore android.flash.mode", 31126356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani __func__); 31136356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 31146356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 31156356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (respectFlashMode) { 31166356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t flashMode = 31176356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_FLASH_MODE).data.u8[0]; 31186356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP, 31196356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(FLASH_MODES_MAP), 31206356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode); 31216356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: flash mode after mapping %d", __func__, flashMode); 31226356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani // To check: CAM_INTF_META_FLASH_MODE usage 31236356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 31246356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(flashMode), &flashMode); 31256356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 3126e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 3127e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 31280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) { 31290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t flashPower = 31300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0]; 31310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER, 31320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(flashPower), &flashPower); 31330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) { 31360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t flashFiringTime = 31370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0]; 31380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 31390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime); 31400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) { 31430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t geometricMode = 31440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0]; 31450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE, 31460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricMode), &geometricMode); 31470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) { 31508867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t geometricStrength = 31510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0]; 31520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 31530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_GEOMETRIC_STRENGTH, 31540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricStrength), &geometricStrength); 31550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) { 31580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t hotPixelMode = 31590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0]; 31600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE, 31610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(hotPixelMode), &hotPixelMode); 31620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_APERTURE)) { 31650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float lensAperture = 31660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find( ANDROID_LENS_APERTURE).data.f[0]; 31670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE, 31680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(lensAperture), &lensAperture); 31690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) { 31720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float filterDensity = 31730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0]; 31740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY, 31750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(filterDensity), &filterDensity); 31760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 31790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float focalLength = 31800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 31810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 31820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_FOCAL_LENGTH, 31830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focalLength), &focalLength); 31840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) { 31870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t optStabMode = 31880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0]; 31898867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 31900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_OPT_STAB_MODE, 31910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(optStabMode), &optStabMode); 31920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) { 31950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedMode = 31960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]; 31978867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 31980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_MODE, 31990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedMode), &noiseRedMode); 32000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) { 32030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedStrength = 32040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0]; 32058867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 32060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_STRENGTH, 32070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedStrength), &noiseRedStrength); 32080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 321071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang cam_crop_region_t scalerCropRegion; 321171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool scalerCropSet = false; 32120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) { 32130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.left = 32140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0]; 32150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.top = 32160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1]; 32170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.width = 32180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2]; 321947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang scalerCropRegion.height = 322047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3]; 32210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SCALER_CROP_REGION, 32230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(scalerCropRegion), &scalerCropRegion); 322471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropSet = true; 32250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { 32280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorExpTime = 32290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0]; 323062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: setting sensorExpTime %lld", __func__, sensorExpTime); 32310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_EXPOSURE_TIME, 32330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorExpTime), &sensorExpTime); 32340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) { 32370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorFrameDuration = 32380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0]; 323962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int64_t minFrameDuration = getMinFrameDuration(request); 324062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang sensorFrameDuration = MAX(sensorFrameDuration, minFrameDuration); 3241e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration) 3242e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration; 324362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: clamp sensorFrameDuration to %lld", __func__, sensorFrameDuration); 32440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_FRAME_DURATION, 32460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorFrameDuration), &sensorFrameDuration); 32470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 32500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t sensorSensitivity = 32510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 3252e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity < 3253e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity) 3254e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 3255e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity; 3256e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity > 3257e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity) 3258e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 3259e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity; 326062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: clamp sensorSensitivity to %d", __func__, sensorSensitivity); 32610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_SENSITIVITY, 32630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorSensitivity), &sensorSensitivity); 32640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_MODE)) { 32670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t shadingMode = 32680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_MODE).data.u8[0]; 32690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE, 32700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingMode), &shadingMode); 32710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) { 32740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t shadingStrength = 32750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0]; 32760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH, 32770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingStrength), &shadingStrength); 32780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) { 32816990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t fwk_facedetectMode = 32820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0]; 32836990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t facedetectMode = 32846990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang lookupHalName(FACEDETECT_MODES_MAP, 32856990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode); 32860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_FACEDETECT_MODE, 32880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(facedetectMode), &facedetectMode); 32890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) { 32920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t histogramMode = 32930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0]; 32940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_HISTOGRAM_MODE, 32960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(histogramMode), &histogramMode); 32970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) { 33000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t sharpnessMapMode = 33010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0]; 33020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 33030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, 33040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sharpnessMapMode), &sharpnessMapMode); 33050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_TONEMAP_MODE)) { 33080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t tonemapMode = 33090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0]; 33100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 33110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_TONEMAP_MODE, 33120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(tonemapMode), &tonemapMode); 33130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3314e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* Tonemap curve channels ch0 = G, ch 1 = B, ch 2 = R */ 3315e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /*All tonemap channels will have the same number of points*/ 3316e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN) && 3317e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE) && 3318e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) { 3319e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_rgb_tonemap_curves tonemapCurves; 3320e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.tonemap_points_cnt = frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).count/2; 3321e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3322e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch0 = G*/ 3323e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang int point = 0; 3324e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_tonemap_curve_t tonemapCurveGreen; 3325e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt ; i++) { 3326d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3327e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurveGreen.tonemap_points[i][j] = 3328e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point]; 3329d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3330d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3331d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3332e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[0] = tonemapCurveGreen; 3333e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3334e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch 1 = B */ 3335e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang point = 0; 3336e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_tonemap_curve_t tonemapCurveBlue; 3337e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 3338d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3339e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurveBlue.tonemap_points[i][j] = 3340e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point]; 3341d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3342d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3343d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3344e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[1] = tonemapCurveBlue; 3345e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3346e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch 2 = R */ 3347e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang point = 0; 3348d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_tonemap_curve_t tonemapCurveRed; 3349e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 3350d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3351d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy tonemapCurveRed.tonemap_points[i][j] = 3352d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point]; 3353d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3354d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3355d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3356e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[2] = tonemapCurveRed; 3357e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3358d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, 3359e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang CAM_INTF_META_TONEMAP_CURVES, 3360e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang sizeof(tonemapCurves), &tonemapCurves); 3361d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 33620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 33640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t captureIntent = 33650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 33660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 33670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(captureIntent), &captureIntent); 33680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3369662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3370d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) { 3371d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t blackLevelLock = 3372d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0]; 3373d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_BLACK_LEVEL_LOCK, 3374d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(blackLevelLock), &blackLevelLock); 3375d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3376d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3377d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) { 3378d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t lensShadingMapMode = 3379d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0]; 3380d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE, 3381d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(lensShadingMapMode), &lensShadingMapMode); 3382d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3383d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 338459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) { 338559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 338671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 338762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AE_REGIONS); 338871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 338971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 339071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 339171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 339271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI, 339371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 339471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 339559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 339659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 339759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) { 339859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 339971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 340062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AF_REGIONS); 340171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 340271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 340371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 340471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 340571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI, 340671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 340771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 340859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 340959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 341059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) { 341159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 341271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 341362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AWB_REGIONS); 341471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 341571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 341671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 341771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 341871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS, 341971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 342071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 342159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 3422662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 3423662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 3424662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3425662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 34260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : getJpegSettings 3427662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 34280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL 3429662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3430662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3431662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 3432662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @settings : frame settings information from framework 3433662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3434662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3435662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : success: NO_ERROR 3436662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * failure: 3437662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 3438662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings 3439662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (const camera_metadata_t *settings) 3440662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 3441662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (mJpegSettings) { 34429a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_timestamp) { 34439a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_timestamp); 34449a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 34459a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 34469a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_coordinates) { 34479a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 34489a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_coordinates[i]); 34499a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 34509a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 34519a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 3452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole free(mJpegSettings); 3453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = NULL; 3454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 3455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t)); 345697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata jpeg_settings; 3457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings = settings; 3458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 34590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) { 34600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 34610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0]; 34620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 34630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 0; 34640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) { 34660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_quality = 34670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0]; 34680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 34691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mJpegSettings->jpeg_quality = 85; 34700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) { 34720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.width = 34730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0]; 34740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.height = 34750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1]; 34760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 347708ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.width = 0; 347808ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.height = 0; 34790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) { 34810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < 3; i++) { 34829a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*)); 34839a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_coordinates[i]) = 34840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i]; 34850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else{ 34879a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 34889a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 34893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 34900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34919a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 34920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { 34939a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*)); 34949a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_timestamp) = 34950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0]; 34969a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 34979a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 34980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { 35019a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count; 35029a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < len; i++) { 35039a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[i] = 35049a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i]; 35059a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 35069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_processing_method[len-1] != '\0') { 35079a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[len] = '\0'; 35089a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 35099a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 35109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[0] = '\0'; 35110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 35130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 35140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->sensor_sensitivity = 35150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 35163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else { 35173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed; 35180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35199a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 35200b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi mJpegSettings->sensor_exposure_time = mMetadataResponse.exposure_time; 35210b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi 35220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 35230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->lens_focal_length = 35240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 35250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 352653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 352753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_compensation = 352853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 352953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 353053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step; 35310a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab mJpegSettings->max_jpeg_size = calcMaxJpegSize(); 35327ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->is_jpeg_format = true; 35337ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask; 353480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 353580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 353680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 353780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 3538e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 3539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 3541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 3544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 3545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 3546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 3548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 35491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata, 3550e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, 3551e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frame_number, void *userdata) 3552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 3554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 3555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 3556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3559e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->captureResultCb(metadata, buffer, frame_number); 3560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 35637ee407aa1024789089aad411c372c79423699976Ajay Dudani 3564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 3566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 3568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 3573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 3574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 3577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 3578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3579d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 35871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->initialize(callback_ops); 3588d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 35891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3593625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 3594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 3601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 3602625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 3603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 3606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 3608625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3609d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3610625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3611625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3615625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 36161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->configureStreams(stream_list); 3617d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 36181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 3623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 3625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 3631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 3633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3634d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 36411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->registerStreamBuffers(buffer_set); 3642d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 36431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 3648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 3650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 3655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 3656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 36579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 36589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 36599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 3660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3662d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 3664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 3669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 367197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole fwk_metadata = hw->translateCapabilityToMetadata(type); 3672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3673d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 3675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 3679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 36879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 36889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 36899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 3690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3691d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 369280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 369380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 369480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 369580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 36969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 369780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 36989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 36991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->processCaptureRequest(request); 3700d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 37011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 3706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3715e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops( 3716e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, 3717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang vendor_tag_query_ops_t* ops) 3718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3719d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->getMetadataVendorTagOps(ops); 3728d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 3734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump( 3744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, int fd) 3745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3746d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->dump(fd); 3755d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3756e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 3760c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION : flush 3761c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3762c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION: 3763c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3764c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS : 3765c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3766c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3767c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN : 3768c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/ 3769c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 3770c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush( 3771c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang const struct camera3_device *device) 3772c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{ 3773c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang int rc; 3774c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGV("%s: E", __func__); 3775c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang QCamera3HardwareInterface *hw = 3776c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3777c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang if (!hw) { 3778c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGE("%s: NULL camera device", __func__); 3779c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return -EINVAL; 3780c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang } 3781c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 3782c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang rc = hw->flush(); 3783c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGV("%s: X", __func__); 3784c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return rc; 3785c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang} 3786c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 3787c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*=========================================================================== 3788e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : close_camera_device 3789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 3791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 3793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3794e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3795e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 3796e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 3797e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 3798e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 3799d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3800e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int ret = NO_ERROR; 3801e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3802e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>( 3803e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<camera3_device_t *>(device)->priv); 3804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("NULL camera device"); 3806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return BAD_VALUE; 3807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete hw; 3809cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 3810cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 3811cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 0; 3812cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 3813d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return ret; 3815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 3816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 38177ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 38187ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : getWaveletDenoiseProcessPlate 38197ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38207ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate 38217ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38227ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None 38237ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38247ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : WNR prcocess plate vlaue 38257ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 38267ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate() 38277ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 38287ee407aa1024789089aad411c372c79423699976Ajay Dudani char prop[PROPERTY_VALUE_MAX]; 38297ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(prop, 0, sizeof(prop)); 38307ee407aa1024789089aad411c372c79423699976Ajay Dudani property_get("persist.denoise.process.plates", prop, "0"); 38317ee407aa1024789089aad411c372c79423699976Ajay Dudani int processPlate = atoi(prop); 38327ee407aa1024789089aad411c372c79423699976Ajay Dudani switch(processPlate) { 38337ee407aa1024789089aad411c372c79423699976Ajay Dudani case 0: 38347ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_YCBCR_PLANE; 38357ee407aa1024789089aad411c372c79423699976Ajay Dudani case 1: 38367ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_CBCR_ONLY; 38377ee407aa1024789089aad411c372c79423699976Ajay Dudani case 2: 38387ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 38397ee407aa1024789089aad411c372c79423699976Ajay Dudani case 3: 38407ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINED_CBCR; 38417ee407aa1024789089aad411c372c79423699976Ajay Dudani default: 38427ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 38437ee407aa1024789089aad411c372c79423699976Ajay Dudani } 38447ee407aa1024789089aad411c372c79423699976Ajay Dudani} 38457ee407aa1024789089aad411c372c79423699976Ajay Dudani 38467ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 38477ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : needRotationReprocess 38487ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38497ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp 38507ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38517ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 38527ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38537ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : true: needed 38547ee407aa1024789089aad411c372c79423699976Ajay Dudani * false: no need 38557ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 38567ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess() 38577ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 38587ee407aa1024789089aad411c372c79423699976Ajay Dudani 38597ee407aa1024789089aad411c372c79423699976Ajay Dudani if (!mJpegSettings->is_jpeg_format) { 38607ee407aa1024789089aad411c372c79423699976Ajay Dudani // RAW image, no need to reprocess 38617ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 38627ee407aa1024789089aad411c372c79423699976Ajay Dudani } 38637ee407aa1024789089aad411c372c79423699976Ajay Dudani 38647ee407aa1024789089aad411c372c79423699976Ajay Dudani if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 && 38657ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->jpeg_orientation > 0) { 38667ee407aa1024789089aad411c372c79423699976Ajay Dudani // current rotation is not zero, and pp has the capability to process rotation 38677ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGD("%s: need do reprocess for rotation", __func__); 38687ee407aa1024789089aad411c372c79423699976Ajay Dudani return true; 38697ee407aa1024789089aad411c372c79423699976Ajay Dudani } 38707ee407aa1024789089aad411c372c79423699976Ajay Dudani 38717ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 38727ee407aa1024789089aad411c372c79423699976Ajay Dudani} 38737ee407aa1024789089aad411c372c79423699976Ajay Dudani 38747ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 3875c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * FUNCTION : needReprocess 3876c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 3877c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * DESCRIPTION: if reprocess in needed 3878c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 3879c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * PARAMETERS : none 3880c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 3881c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * RETURN : true: needed 3882c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * false: no need 3883c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *==========================================================================*/ 3884c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajanbool QCamera3HardwareInterface::needReprocess() 3885c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan{ 3886c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if (!mJpegSettings->is_jpeg_format) { 3887c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // RAW image, no need to reprocess 3888c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return false; 3889c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 3890c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 3891c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if ((mJpegSettings->min_required_pp_mask > 0) || 3892c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan isWNREnabled()) { 3893c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // TODO: add for ZSL HDR later 3894c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // pp module has min requirement for zsl reprocess, or WNR in ZSL mode 3895c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__); 3896c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return true; 3897c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 3898c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return needRotationReprocess(); 3899c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan} 3900c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 3901c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan/*=========================================================================== 39027ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : addOnlineReprocChannel 39037ee407aa1024789089aad411c372c79423699976Ajay Dudani * 39047ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames 39057ee407aa1024789089aad411c372c79423699976Ajay Dudani * coming from input channel 39067ee407aa1024789089aad411c372c79423699976Ajay Dudani * 39077ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 39087ee407aa1024789089aad411c372c79423699976Ajay Dudani * @pInputChannel : ptr to input channel whose frames will be post-processed 39097ee407aa1024789089aad411c372c79423699976Ajay Dudani * 39107ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : Ptr to the newly created channel obj. NULL if failed. 39117ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 39127ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel( 3913d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle) 39147ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 39157ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t rc = NO_ERROR; 39167ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3ReprocessChannel *pChannel = NULL; 39177ee407aa1024789089aad411c372c79423699976Ajay Dudani if (pInputChannel == NULL) { 39187ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: input channel obj is NULL", __func__); 39197ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39207ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39217ee407aa1024789089aad411c372c79423699976Ajay Dudani 39227ee407aa1024789089aad411c372c79423699976Ajay Dudani pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle, 39237ee407aa1024789089aad411c372c79423699976Ajay Dudani mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle); 39247ee407aa1024789089aad411c372c79423699976Ajay Dudani if (NULL == pChannel) { 39257ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: no mem for reprocess channel", __func__); 39267ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39277ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39287ee407aa1024789089aad411c372c79423699976Ajay Dudani 39297ee407aa1024789089aad411c372c79423699976Ajay Dudani // Capture channel, only need snapshot and postview streams start together 39307ee407aa1024789089aad411c372c79423699976Ajay Dudani mm_camera_channel_attr_t attr; 39317ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 39327ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 39337ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue(); 39347ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->initialize(); 39357ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 39367ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc); 39377ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 39387ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39397ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39407ee407aa1024789089aad411c372c79423699976Ajay Dudani 39417ee407aa1024789089aad411c372c79423699976Ajay Dudani // pp feature config 39427ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_pp_feature_config_t pp_config; 39437ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&pp_config, 0, sizeof(cam_pp_feature_config_t)); 39447ee407aa1024789089aad411c372c79423699976Ajay Dudani if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) { 39457ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS; 39467ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.sharpness = 10; 39477ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39487ee407aa1024789089aad411c372c79423699976Ajay Dudani 39497ee407aa1024789089aad411c372c79423699976Ajay Dudani if (isWNREnabled()) { 39507ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D; 39517ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.denoise_enable = 1; 39527ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate(); 39537ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39547ee407aa1024789089aad411c372c79423699976Ajay Dudani if (needRotationReprocess()) { 39557ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION; 39567ee407aa1024789089aad411c372c79423699976Ajay Dudani int rotation = mJpegSettings->jpeg_orientation; 39577ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rotation == 0) { 39587ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_0; 39597ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 90) { 39607ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_90; 39617ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 180) { 39627ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_180; 39637ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 270) { 39647ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_270; 39657ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39667ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39677ee407aa1024789089aad411c372c79423699976Ajay Dudani 39687ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->addReprocStreamsFromSource(pp_config, 39697ee407aa1024789089aad411c372c79423699976Ajay Dudani pInputChannel, 39707ee407aa1024789089aad411c372c79423699976Ajay Dudani mMetadataChannel); 39717ee407aa1024789089aad411c372c79423699976Ajay Dudani 39727ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 39737ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 39747ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39757ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39767ee407aa1024789089aad411c372c79423699976Ajay Dudani return pChannel; 39777ee407aa1024789089aad411c372c79423699976Ajay Dudani} 39787ee407aa1024789089aad411c372c79423699976Ajay Dudani 39797ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue() 39807ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 39817ee407aa1024789089aad411c372c79423699976Ajay Dudani return gCamCapability[mCameraId]->min_num_pp_bufs; 39827ee407aa1024789089aad411c372c79423699976Ajay Dudani} 39837ee407aa1024789089aad411c372c79423699976Ajay Dudani 3984acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajanbool QCamera3HardwareInterface::isWNREnabled() { 3985acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan return gCamCapability[mCameraId]->isWnrSupported; 3986acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan} 3987acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan 3988625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 3989