QCamera3HWI.cpp revision 0f0f251722ee12e53bab3d4e4918e541ebc82722
1625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 2625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 3625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* Redistribution and use in source and binary forms, with or without 4625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* modification, are permitted provided that the following conditions are 5625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* met: 6625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Redistributions of source code must retain the above copyright 7625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* notice, this list of conditions and the following disclaimer. 8625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Redistributions in binary form must reproduce the above 9625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* copyright notice, this list of conditions and the following 10625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* disclaimer in the documentation and/or other materials provided 11625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* with the distribution. 12625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Neither the name of The Linux Foundation nor the names of its 13625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* contributors may be used to endorse or promote products derived 14625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* from this software without specific prior written permission. 15625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 16625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 28625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*/ 29625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 30625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define LOG_TAG "QCamera3HWI" 3114dfc272241ba78c85a327da2872e71b3208f8c5Shuzhen Wang//#define LOG_NDEBUG 0 32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 33625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <cutils/properties.h> 34625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h> 35625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <camera/CameraMetadata.h> 36625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <stdlib.h> 37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h> 38625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h> 39e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <ui/Fence.h> 40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h> 41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h" 42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h" 43625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h" 4466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h" 45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android; 47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera { 4962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 5062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang#define MAX(a, b) ((a) > (b) ? (a) : (b)) 5162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 53625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS]; 5480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings; 55b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS]; 56625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 57cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangpthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock = 58cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang PTHREAD_MUTEX_INITIALIZER; 59cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangunsigned int QCamera3HardwareInterface::mCameraSessionActive = 0; 60cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = { 62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_OFF, CAM_EFFECT_MODE_OFF }, 63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_MONO, CAM_EFFECT_MODE_MONO }, 64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE, CAM_EFFECT_MODE_NEGATIVE }, 65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE, CAM_EFFECT_MODE_SOLARIZE }, 66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SEPIA, CAM_EFFECT_MODE_SEPIA }, 67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE, CAM_EFFECT_MODE_POSTERIZE }, 68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD }, 69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD }, 70662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_AQUA, CAM_EFFECT_MODE_AQUA } 71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = { 740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_OFF, CAM_WB_MODE_OFF }, 75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_AUTO, CAM_WB_MODE_AUTO }, 76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_INCANDESCENT, CAM_WB_MODE_INCANDESCENT }, 77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_FLUORESCENT, CAM_WB_MODE_FLUORESCENT }, 78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT}, 79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_DAYLIGHT, CAM_WB_MODE_DAYLIGHT }, 80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT }, 81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_TWILIGHT, CAM_WB_MODE_TWILIGHT }, 82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_SHADE, CAM_WB_MODE_SHADE } 83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = { 86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_ACTION, CAM_SCENE_MODE_ACTION }, 87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PORTRAIT, CAM_SCENE_MODE_PORTRAIT }, 88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE, CAM_SCENE_MODE_LANDSCAPE }, 89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT, CAM_SCENE_MODE_NIGHT }, 90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT }, 91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_THEATRE, CAM_SCENE_MODE_THEATRE }, 92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BEACH, CAM_SCENE_MODE_BEACH }, 93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SNOW, CAM_SCENE_MODE_SNOW }, 94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SUNSET, CAM_SCENE_MODE_SUNSET }, 95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO, CAM_SCENE_MODE_ANTISHAKE }, 96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_FIREWORKS , CAM_SCENE_MODE_FIREWORKS }, 97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SPORTS , CAM_SCENE_MODE_SPORTS }, 98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PARTY, CAM_SCENE_MODE_PARTY }, 99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT, CAM_SCENE_MODE_CANDLELIGHT }, 10097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BARCODE, CAM_SCENE_MODE_BARCODE} 101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = { 104b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang { ANDROID_CONTROL_AF_MODE_OFF, CAM_FOCUS_MODE_FIXED }, 105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_AUTO, CAM_FOCUS_MODE_AUTO }, 106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_MACRO, CAM_FOCUS_MODE_MACRO }, 107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_EDOF, CAM_FOCUS_MODE_EDOF }, 108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE }, 109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO, CAM_FOCUS_MODE_CONTINOUS_VIDEO } 110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = { 113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, CAM_ANTIBANDING_MODE_OFF }, 114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ }, 115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ }, 116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO } 117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 119e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = { 120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_OFF, CAM_FLASH_MODE_OFF }, 121e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON, CAM_FLASH_MODE_OFF }, 122e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH, CAM_FLASH_MODE_AUTO}, 123e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH, CAM_FLASH_MODE_ON }, 124e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO} 125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 126662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = { 128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_OFF, CAM_FLASH_MODE_OFF }, 1296356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE }, 1306356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani { ANDROID_FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH } 131662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 132662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1336990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FACEDETECT_MODES_MAP[] = { 1346990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang { ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, CAM_FACE_DETECT_MODE_OFF }, 1356990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang { ANDROID_STATISTICS_FACE_DETECT_MODE_FULL, CAM_FACE_DETECT_MODE_FULL } 1366990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang}; 1376990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang 13808ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288, 13908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab 320, 240, 176, 144, 0, 0}; 140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = { 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang initialize: QCamera3HardwareInterface::initialize, 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang configure_streams: QCamera3HardwareInterface::configure_streams, 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang register_stream_buffers: QCamera3HardwareInterface::register_stream_buffers, 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings, 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang process_capture_request: QCamera3HardwareInterface::process_capture_request, 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang get_metadata_vendor_tag_ops: QCamera3HardwareInterface::get_metadata_vendor_tag_ops, 148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang dump: QCamera3HardwareInterface::dump, 149c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang flush: QCamera3HardwareInterface::flush, 150c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang reserved: {0}, 151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; 152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3HardwareInterface 156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface 158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera ID 161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId) 165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang : mCameraId(cameraId), 166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle(NULL), 167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened(false), 168cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraInitialized(false), 16997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mCallbackOps(NULL), 17033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mInputStream(NULL), 17133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mMetadataChannel(NULL), 1727ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel(NULL), 17333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest(false), 17433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap(NULL), 17533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters(NULL), 17699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan mJpegSettings(NULL), 1778bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode(false), 17862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinProcessedFrameDuration(0), 17962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinJpegFrameDuration(0), 18062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinRawFrameDuration(0), 18199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule(NULL) 182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 184e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0; 185e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.close = close_camera_device; 186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.ops = &mCameraOps; 187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.priv = this; 188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->version = CAM_HAL_V3; 1897ee407aa1024789089aad411c372c79423699976Ajay Dudani // TODO: hardcode for now until mctl add support for min_num_pp_bufs 1907ee407aa1024789089aad411c372c79423699976Ajay Dudani //TBD - To see if this hardcoding is needed. Check by printing if this is filled by mctl to 3 1917ee407aa1024789089aad411c372c79423699976Ajay Dudani gCamCapability[cameraId]->min_num_pp_bufs = 3; 1929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_init(&mRequestCond, NULL); 1949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 19574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = -1; 196e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_init(&mMutex, NULL); 19733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 19833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 19933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mDefaultMetadata[i] = NULL; 20099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan 20199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 20299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) { 20399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID); 20499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 20599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 21166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface 212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 219d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 220d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* We need to stop all streams before deleting any stream */ 221d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab /*flush the metadata list*/ 222d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!mStoredMetadataList.empty()) { 223d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 224d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 225d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 226d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 227d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 228d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 229d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 2301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 2311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 2321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 233dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (channel) 2347ee407aa1024789089aad411c372c79423699976Ajay Dudani channel->stop(); 235d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang } 236d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 237d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang it != mStreamInfo.end(); it++) { 238d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 2390f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang if ((*it)->registered && (*it)->buffer_set.buffers) { 2400f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang delete[] (buffer_handle_t*)(*it)->buffer_set.buffers; 2410f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang } 242dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (channel) 243dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang delete channel; 2441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free (*it); 2451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 2461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 2477ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel = NULL; 2487ee407aa1024789089aad411c372c79423699976Ajay Dudani 24997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (mJpegSettings != NULL) { 25097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole free(mJpegSettings); 25197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mJpegSettings = NULL; 25297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 253dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 254dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang /* Clean up all channels */ 255dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (mCameraInitialized) { 2564e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang if (mMetadataChannel) { 2574e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang mMetadataChannel->stop(); 2584e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang delete mMetadataChannel; 2594e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang mMetadataChannel = NULL; 2604e5fef6d28e89ec2635f92ea344d3947a7bd4422Shuzhen Wang } 261dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang deinitParameters(); 262dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang } 263dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 264cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraOpened) 265cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang closeCamera(); 266e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 26733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 26833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (mDefaultMetadata[i]) 26933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang free_camera_metadata(mDefaultMetadata[i]); 27033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 271e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_cond_destroy(&mRequestCond); 272e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 273e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mMutex); 274d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 292cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 293cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraSessionActive) { 294cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang ALOGE("%s: multiple simultaneous camera instance not supported", __func__); 295cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 296706d3c51bdf8f3482216d3a90156573bdfa02ef8Zhijun He return -EDQUOT; 297cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } 298cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 305cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (rc == 0) { 306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 307cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 1; 308cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } else 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 310cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 31199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 31299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == 0) { 31399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 31499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 31599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 31699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=1"); 31799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 31899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 31999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 32099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 321cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 37299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 37399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == NO_ERROR) { 37499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 37599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 37699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 37799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=0"); 37899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 37999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 38099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 38199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 38299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan 383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 4009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 402e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 403e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 40433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang rc = initParameters(); 40533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (rc < 0) { 40633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang ALOGE("%s: initParamters failed %d", __func__, rc); 40733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang goto err1; 40833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } 4099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCallbackOps = callback_ops; 410e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 411e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 412cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraInitialized = true; 4139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 4149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 4159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1: 416e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 4179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 43533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int rc = 0; 436d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mIsZslMode = false; 43762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /* first invalidate all the steams in the mStreamList 4550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * if they appear again, they will be validated */ 4561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 458d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 459d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang channel->stop(); 4600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = INVALID; 4610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 46262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang if (mMetadataChannel) { 46362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang /* If content of mStreamInfo is not 0, there is metadata stream */ 46462595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang mMetadataChannel->stop(); 46562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang } 46662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang 46762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang pthread_mutex_lock(&mMutex); 46862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang 46962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang camera3_stream_t *inputStream = NULL; 47062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang camera3_stream_t *jpegStream = NULL; 47162595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang cam_stream_size_info_t stream_config_info; 472d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 474625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 475c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d", 476c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, newStream->stream_type, newStream->format, 477c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang newStream->width, newStream->height); 4780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //if the stream is in the mStreamList validate it 4790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole bool stream_exists = false; 4801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 4820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if ((*it)->stream == newStream) { 4831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = 4841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (QCamera3Channel*)(*it)->stream->priv; 4850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_exists = true; 4860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = RECONFIGURE; 4871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*delete the channel object associated with the stream because 4881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole we need to reconfigure*/ 4891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 4901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->stream->priv = NULL; 4910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (!stream_exists) { 4940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //new stream 4950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info_t* stream_info; 4960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info = (stream_info_t* )malloc(sizeof(stream_info_t)); 4970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->stream = newStream; 4980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->status = VALID; 4991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole stream_info->registered = 0; 5000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mStreamInfo.push_back(stream_info); 5010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 502c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT 503c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) { 504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 505625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 506e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 507625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 508625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 509625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 510625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 511c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->format == HAL_PIXEL_FORMAT_BLOB) { 512c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream = newStream; 513c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 5170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /*clean up invalid streams*/ 5181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 5191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end();) { 5200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if(((*it)->status) == INVALID){ 5211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 5221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 5230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole delete[] (buffer_handle_t*)(*it)->buffer_set.buffers; 5240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole free(*it); 5251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it = mStreamInfo.erase(it); 5261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 5271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it++; 5280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 53062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang if (mMetadataChannel) { 53162595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang delete mMetadataChannel; 53262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang mMetadataChannel = NULL; 53362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang } 534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 53562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang //Create metadata channel and initialize it 53662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 53762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang mCameraHandle->ops, captureResultCb, 53862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this); 53962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang if (mMetadataChannel == NULL) { 54062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang ALOGE("%s: failed to allocate metadata channel", __func__); 54162595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang rc = -ENOMEM; 54262595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang pthread_mutex_unlock(&mMutex); 54362595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang return rc; 54462595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang } 54562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang rc = mMetadataChannel->initialize(); 54662595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang if (rc < 0) { 54762595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang ALOGE("%s: metadata channel initialization failed", __func__); 54862595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang delete mMetadataChannel; 54962595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang pthread_mutex_unlock(&mMutex); 55062595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang return rc; 55162595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang } 552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 556dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang uint32_t stream_usage = newStream->usage; 557d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].width = newStream->width; 558d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].height = newStream->height; 559d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 560d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang newStream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && jpegStream){ 561d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang //for zsl stream the size is jpeg size 562d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].width = jpegStream->width; 563d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].height = jpegStream->height; 564dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_SNAPSHOT; 565dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang } else { 566dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang //for non zsl streams find out the format 567dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang switch (newStream->format) { 568dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED : 569dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang { 570dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang if (stream_usage & private_handle_t::PRIV_FLAGS_VIDEO_ENCODER) { 571dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_VIDEO; 572dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang } else { 573dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_PREVIEW; 574dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang } 575dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang } 576dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang break; 577dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang case HAL_PIXEL_FORMAT_YCbCr_420_888: 578dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_CALLBACK; 579dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang break; 580dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang case HAL_PIXEL_FORMAT_BLOB: 581dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT; 582dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang break; 583dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang default: 584dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang stream_config_info.type[i] = CAM_STREAM_TYPE_DEFAULT; 585dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang break; 586dac62b757b64e83a6add04a9fae98a857b1c28f8Shuzhen Wang } 587d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang } 588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 591f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_INPUT: 592f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 593f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 594f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_BIDIRECTIONAL: 595f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 596f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab GRALLOC_USAGE_HW_CAMERA_WRITE; 597f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 598f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_OUTPUT: 599c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /* For video encoding stream, set read/write rarely 600c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * flag so that they may be set to un-cached */ 601c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) 602c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang newStream->usage = 603c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang (GRALLOC_USAGE_SW_READ_RARELY | 604c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang GRALLOC_USAGE_SW_WRITE_RARELY | 605c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang GRALLOC_USAGE_HW_CAMERA_WRITE); 606c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang else 607c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 608f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 609f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 610f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 611f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 6151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 616625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 617625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 618f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 6198867984d33ed870071109a4500402dddbc85c048Shuzhen Wang case HAL_PIXEL_FORMAT_YCbCr_420_888: 620f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 621c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 622c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream) { 623c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t width = jpegStream->width; 624c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t height = jpegStream->height; 6258bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode = true; 626c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 627c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mCameraHandle->ops, captureResultCb, 628c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this, newStream, 629c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang width, height); 630c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else 631c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 632f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 633f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 634f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 635f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 636f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 637f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 638f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 639f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 640f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 641f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 642f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_BLOB: 643f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 6447ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle, 645f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 646f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 6477ee407aa1024789089aad411c372c79423699976Ajay Dudani if (mPictureChannel == NULL) { 648f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 649f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 650f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 651f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 6527ee407aa1024789089aad411c372c79423699976Ajay Dudani newStream->priv = (QCamera3Channel*)mPictureChannel; 653f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 654f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 655f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab //TODO: Add support for app consumed format? 656f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 657f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 658f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 6668867984d33ed870071109a4500402dddbc85c048Shuzhen Wang /*For the streams to be reconfigured we need to register the buffers 6671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole since the framework wont*/ 6681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 6691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 6701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->status == RECONFIGURE) { 6711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 6721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*only register buffers for streams that have already been 6731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole registered*/ 6741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->registered) { 6751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = channel->registerBuffers((*it)->buffer_set.num_buffers, 6761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers); 6771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (rc != NO_ERROR) { 6781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Failed to register the buffers of old stream,\ 6791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = %d", __func__, rc); 6801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 681a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: channel %p has %d buffers", 682e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, channel, (*it)->buffer_set.num_buffers); 6830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream); 6871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (index == NAME_NOT_FOUND) { 6881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.add((*it)->stream, 0); 6891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 6901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueAt(index) = 0; 6911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 6920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Initialize mPendingRequestInfo and mPendnigBuffersMap */ 6951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.clear(); 6961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 697d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab /*flush the metadata list*/ 698d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!mStoredMetadataList.empty()) { 699d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 700d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 701d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 702d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 703d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 704d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 705d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 706d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 707d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.num_streams = streamList->num_streams; 708d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab 70933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang //settings/parameters don't carry over for new configureStreams 7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 711d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang 712d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 713d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 714d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang sizeof(hal_version), &hal_version); 715d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang 716d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_INFO, 717d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang sizeof(stream_config_info), &stream_config_info); 718d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang 719d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 720d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang 72133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest = true; 72233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 72362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Get min frame duration for this streams configuration 72462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang deriveMinFrameDuration(); 72562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 72733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return rc; 728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : validateCaptureRequest 732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service 73480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 73580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 73680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 73780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 73880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 73980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 74080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest( 7429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 74380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 7449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 7459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 7469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 7479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 7499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 7509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 7519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 7559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 7569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 7579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 7589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 7599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 7629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 7639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 7649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 767c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang b = request->input_buffer; 768c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel *channel = 769c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 770c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (channel == NULL) { 771c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 772c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 773c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 774c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 775c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 776c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 777c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 778c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 779c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 780c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->release_fence != -1) { 781c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 782c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 783c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 784c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 785c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->buffer == NULL) { 786c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 787c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 788c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 789c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 7909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 7939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 7949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 7959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 7969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 7979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 7989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 7999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 8009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 8019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 8039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 8049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 8059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 8069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 8089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 8099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 8109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 8119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 8139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 8149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 8159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 8169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 8189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 8199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 8209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 821e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 822e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 823e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 824e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 82562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION : deriveMinFrameDuration 82662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 82762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: derive mininum processed, jpeg, and raw frame durations based 82862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * on currently configured streams. 82962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 83062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : NONE 83162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 83262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN : NONE 83362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 83462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/ 83562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangvoid QCamera3HardwareInterface::deriveMinFrameDuration() 83662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{ 83762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t maxJpegDimension, maxProcessedDimension; 83862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 83962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxJpegDimension = 0; 84062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = 0; 84162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 84262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang // Figure out maximum jpeg, processed, and raw dimensions 84362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (List<stream_info_t*>::iterator it = mStreamInfo.begin(); 84462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang it != mStreamInfo.end(); it++) { 84562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 84662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang // Input stream doesn't have valid stream_type 84762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if ((*it)->stream->stream_type == CAMERA3_STREAM_INPUT) 84862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang continue; 84962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 85062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t dimension = (*it)->stream->width * (*it)->stream->height; 85162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if ((*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) { 85262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (dimension > maxJpegDimension) 85362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxJpegDimension = dimension; 85462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } else if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_SENSOR) { 85562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (dimension > maxProcessedDimension) 85662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = dimension; 85762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 85862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 85962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 86062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Assume all jpeg dimensions are in processed dimensions. 86162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (maxJpegDimension > maxProcessedDimension) 86262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = maxJpegDimension; 86362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 86462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Find minimum durations for processed, jpeg, and raw 86562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinRawFrameDuration = gCamCapability[mCameraId]->raw_min_duration; 86662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 86762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (maxProcessedDimension == 86862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang gCamCapability[mCameraId]->picture_sizes_tbl[i].width * 86962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang gCamCapability[mCameraId]->picture_sizes_tbl[i].height) { 87062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinProcessedFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i]; 87162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinJpegFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i]; 87262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang break; 87362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 87462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 87562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang} 87662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 87762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*=========================================================================== 87862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION : getMinFrameDuration 87962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 88062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: get minimum frame draution based on the current maximum frame durations 88162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * and current request configuration. 88262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 88362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : @request: requset sent by the frameworks 88462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 88562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN : min farme duration for a particular request 88662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 88762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/ 88862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint64_t QCamera3HardwareInterface::getMinFrameDuration(const camera3_capture_request_t *request) 88962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{ 89062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang bool hasJpegStream = false; 89162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (uint32_t i = 0; i < request->num_output_buffers; i ++) { 89262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang const camera3_stream_t *stream = request->output_buffers[i].stream; 89362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (stream->format == HAL_PIXEL_FORMAT_BLOB) 89462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang hasJpegStream = true; 89562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 89662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 89762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (!hasJpegStream) 89862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return MAX(mMinRawFrameDuration, mMinProcessedFrameDuration); 89962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang else 90062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return MAX(MAX(mMinRawFrameDuration, mMinProcessedFrameDuration), mMinJpegFrameDuration); 90162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang} 90262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 90362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*=========================================================================== 904e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : registerStreamBuffers 905e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 906e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 907e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 908e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 909e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @stream_list : streams to be configured 910e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 911e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 912e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 913e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 914e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 915e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 916e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 917e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = 0; 918e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 919e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 920e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 921e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set == NULL) { 922e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 923e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 924e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 925e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 926e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->stream == NULL) { 927e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 928e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 929e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 930e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 931e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->num_buffers < 1) { 932e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 933e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 934e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 935e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 936e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->buffers == NULL) { 937e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 938e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 939e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 940e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 941e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 943e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 944e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 9450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //set the buffer_set in the mStreamInfo array 9461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 9471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 9481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->stream == stream) { 9490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint32_t numBuffers = buffer_set->num_buffers; 9501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.stream = buffer_set->stream; 9511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.num_buffers = numBuffers; 9521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers]; 9531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->buffer_set.buffers == NULL) { 9540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Failed to allocate buffer_handle_t*", __func__); 9550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_unlock(&mMutex); 9560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole return -ENOMEM; 9570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (size_t j = 0; j < numBuffers; j++){ 9591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers[j] = buffer_set->buffers[j]; 9600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->registered = 1; 9620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 964e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 966e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 967e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 968e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENODEV; 969e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 970e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 971e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 972e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 973e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 976e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : processCaptureRequest 977e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service 979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 980e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 981e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @request : request from framework to process 982e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 986e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 987e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_request_t *request) 988e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 989e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = NO_ERROR; 99074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id; 991e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata meta; 992d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo reproc_meta; 993d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int queueMetadata = 0; 994e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 995e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 996e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 9972123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang rc = validateCaptureRequest(request); 9982123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang if (rc != NO_ERROR) { 9992123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang ALOGE("%s: incoming request is not valid", __func__); 10002123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang pthread_mutex_unlock(&mMutex); 10012123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang return rc; 10022123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang } 10032123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 10042123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang meta = request->settings; 10052123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 10062123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang // For first capture request, send capture intent, and 10072123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang // stream on all streams 1008d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang if (mFirstRequest) { 10092123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 10102123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 10112123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang int32_t hal_version = CAM_HAL_V3; 10122123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang uint8_t captureIntent = 10132123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 10142123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 10152123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 10162123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 10172123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 10182123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang sizeof(hal_version), &hal_version); 10192123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 10202123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang sizeof(captureIntent), &captureIntent); 10212123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, 10222123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mParameters); 10232123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang } 10242123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 102562595db7d19b3c5997145f35f1d26b87102aa984Shuzhen Wang mMetadataChannel->start(); 1026d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 1027d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang it != mStreamInfo.end(); it++) { 1028d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 1029d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang channel->start(); 1030d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang } 1031d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang } 1032d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang 1033e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frameNumber = request->frame_number; 103434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy uint32_t streamTypeMask = 0; 10359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 103674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab if (meta.exists(ANDROID_REQUEST_ID)) { 103774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0]; 103874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = request_id; 1039013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Received request with id: %d",__func__, request_id); 104074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else if (mFirstRequest || mCurrentRequestId == -1){ 104174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab ALOGE("%s: Unable to find request id field, \ 104274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab & no previous id available", __func__); 104374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab return NAME_NOT_FOUND; 104474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else { 1045013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Re-using old request id", __func__); 104674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = mCurrentRequestId; 104774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } 104874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 1049ba7843eb48941909a360512af9d0596790d7d887Iliyan Malchev ALOGV("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d", 1050c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, __LINE__, 1051c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->num_output_buffers, 1052c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer, 1053c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang frameNumber); 1054e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // Acquire all request buffers first 10557ee407aa1024789089aad411c372c79423699976Ajay Dudani int blob_request = 0; 1056e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 1057e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 105834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 1059e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang sp<Fence> acquireFence = new Fence(output.acquire_fence); 106066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 106166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 106266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Call function to store local copy of jpeg data for encode params. 10637ee407aa1024789089aad411c372c79423699976Ajay Dudani blob_request = 1; 106466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = getJpegSettings(request->settings); 106566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (rc < 0) { 10660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: failed to get jpeg parameters", __func__); 106766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pthread_mutex_unlock(&mMutex); 106866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 106966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 107066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 107166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1072e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 1073e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != OK) { 1074e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: fence wait failed %d", __func__, rc); 1075e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1076e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 1077e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 107834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy streamTypeMask |= channel->getStreamTypeMask(); 107934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy } 108034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy 108162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = setFrameParameters(request, streamTypeMask); 108234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy if (rc < 0) { 108334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy ALOGE("%s: fail to set frame parameters", __func__); 108434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy pthread_mutex_unlock(&mMutex); 108534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy return rc; 1086e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1087e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 10881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Update pending request list and pending buffers map */ 10891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole PendingRequestInfo pendingRequest; 10901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.frame_number = frameNumber; 10911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.num_buffers = request->num_output_buffers; 109274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab pendingRequest.request_id = request_id; 10937ee407aa1024789089aad411c372c79423699976Ajay Dudani pendingRequest.blob_request = blob_request; 109413c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab pendingRequest.input_buffer_present = (request->input_buffer != NULL)? 1 : 0; 109574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 10961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < request->num_output_buffers; i++) { 10971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole RequestedBufferInfo requestedBuf; 10981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.stream = request->output_buffers[i].stream; 10991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.buffer = NULL; 11001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.buffers.push_back(requestedBuf); 11011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 11021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(requestedBuf.stream)++; 11031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.push_back(pendingRequest); 11051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 11069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 1107e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMetadataChannel->request(NULL, frameNumber); 11089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 11099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 11109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 11119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 11129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 1113c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mm_camera_buf_def_t *pInputBuffer = NULL; 111466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 11159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 11169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 11179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 11189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 11199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 112066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 1121c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3RegularChannel* inputChannel = NULL; 1122c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(request->input_buffer != NULL){ 1123c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang //Try to get the internal format 1124c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel = (QCamera3RegularChannel*) 1125c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->stream->priv; 1126c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(inputChannel == NULL ){ 1127c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: failed to get input channel handle", __func__); 1128c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else { 1129c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer = 1130c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel->getInternalFormatBuffer( 1131c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->buffer); 1132c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("%s: Input buffer dump",__func__); 1133c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("Stream id: %d", pInputBuffer->stream_id); 1134c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("streamtype:%d", pInputBuffer->stream_type); 1135c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("frame len:%d", pInputBuffer->frame_len); 113641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab ALOGD("Handle:%p", request->input_buffer->buffer); 1137d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //TODO: need to get corresponding metadata and send it to pproc 1138d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1139d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 1140d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->zsl_buf_hdl == request->input_buffer->buffer) { 1141d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab reproc_meta.meta_buf = m->meta_buf; 1142d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab queueMetadata = 1; 1143d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1144d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1145d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1146c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1147c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1148c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang rc = channel->request(output.buffer, frameNumber, mJpegSettings, 1149c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer,(QCamera3Channel*)inputChannel); 1150d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (queueMetadata) { 115141da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(reproc_meta.meta_buf,mMetadataChannel,false); 1152d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 115366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 1154ba7843eb48941909a360512af9d0596790d7d887Iliyan Malchev ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__, 1155a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab __LINE__, output.buffer, frameNumber); 1156d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (mIsZslMode && output.stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1157d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1158d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 1159d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (uint32_t j = 0; j < request->num_output_buffers; j++) { 1160d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->zsl_buf_hdl == request->output_buffers[j].buffer) { 1161d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 1162d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 1163d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 1164d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1165d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1166d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1167d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1168d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 116966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = channel->request(output.buffer, frameNumber); 117066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 11719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 11729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 11739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 11749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 11751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mFirstRequest = false; 11769770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab // Added a timed condition wait 11779770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab struct timespec ts; 11789770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab uint8_t isValidTimeout = 1; 11799770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab rc = clock_gettime(CLOCK_REALTIME, &ts); 11809770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab if (rc < 0) { 11819770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab isValidTimeout = 0; 11829770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ALOGE("%s: Error reading the real time clock!!", __func__); 11839770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab } 11849770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab else { 11859770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab // Make timeout as 5 sec for request to be honored 11869770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ts.tv_sec += 5; 11879770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab } 11889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 11899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 1; 11909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang while (mPendingRequest == 1) { 11919770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab if (!isValidTimeout) { 11929770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ALOGV("%s: Blocking on conditional wait", __func__); 11939770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab pthread_cond_wait(&mRequestCond, &mMutex); 11949770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab } 11959770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab else { 11969770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ALOGV("%s: Blocking on timed conditional wait", __func__); 11979770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab rc = pthread_cond_timedwait(&mRequestCond, &mMutex, &ts); 11989770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab if (rc == ETIMEDOUT) { 11999770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab rc = -ENODEV; 12009770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ALOGE("%s: Unblocked on timeout!!!!", __func__); 12019770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab break; 12029770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab } 12039770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab } 12049770445fab16c26a86acb1dc261f2e41a687ddf8Mansoor Aftab ALOGV("%s: Unblocked", __func__); 12059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 12069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1207e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 120880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 120980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 121080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 12119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 1212e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : getMetadataVendorTagOps 12139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 1214e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 12159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 12169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 1217e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1218e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1219e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1220e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1221b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps( 1222b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang vendor_tag_query_ops_t* /*ops*/) 1223e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1224e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Enable locks when we eventually add Vendor Tags */ 1225e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 1226e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1227e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1228e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1229e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 1230e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1231e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1232e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1233e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1234e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : dump 1235e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1236e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 1237e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1238e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1239e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1240e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1241e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1242e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1243b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/) 1244e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1245e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /*Enable lock when we implement this function*/ 1246e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 1247e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1248e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1249e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1250e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 1251e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1252e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1253e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1254c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*=========================================================================== 1255c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION : flush 1256c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1257c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION: 1258c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1259c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS : 1260c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1261c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1262c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN : 1263c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/ 1264c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush() 1265c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{ 1266c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /*Enable lock when we implement this function*/ 1267c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /* 1268c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang pthread_mutex_lock(&mMutex); 1269c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 1270c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang pthread_mutex_unlock(&mMutex); 1271c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang */ 1272c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return 0; 1273c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang} 12747ee407aa1024789089aad411c372c79423699976Ajay Dudani 1275e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1276e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 1277e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 127833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result 127933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * (streams, as well as metadata) 1280e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1281e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1282e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @metadata : metadata information 128333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. 128433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * NULL if metadata. 12859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 12869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 12879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 12881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf, 1289e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 12909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 12915b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_lock(&mMutex); 1292e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 12931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (metadata_buf) { 12941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer; 129533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int32_t frame_number_valid = *(int32_t *) 129633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata); 1297152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang uint32_t pending_requests = *(uint32_t *)POINTER_OF( 1298152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang CAM_INTF_META_PENDING_REQUESTS, metadata); 129933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang uint32_t frame_number = *(uint32_t *) 130033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata); 13010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole const struct timeval *tv = (const struct timeval *) 13020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata); 13030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC + 13040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole tv->tv_usec * NSEC_PER_USEC; 13050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 13061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!frame_number_valid) { 1307a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: Not a valid frame number, used as SOF only", __func__); 13081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->bufDone(metadata_buf); 13090f0f251722ee12e53bab3d4e4918e541ebc82722Shuzhen Wang free(metadata_buf); 13101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole goto done_metadata; 13111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1312a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__, 1313e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang frame_number, capture_time); 13141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 13151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Go through the pending requests info and send shutter/results to frameworks 13161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1317e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i != mPendingRequestsList.end() && i->frame_number <= frame_number;) { 13181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 13191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_notify_msg_t notify_msg; 1320a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number); 13211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 13221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Flush out all entries with less or equal frame numbers. 13231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 1324e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: Make sure shutter timestamp really reflects shutter timestamp. 1325e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //Right now it's the same as metadata timestamp 1326e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 1327e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: When there is metadata drop, how do we derive the timestamp of 1328e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //dropped frames? For now, we fake the dropped timestamp by substracting 1329e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //from the reported timestamp 1330e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang nsecs_t current_capture_time = capture_time - 1331e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang (frame_number - i->frame_number) * NSEC_PER_33MSEC; 1332e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 13331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send shutter notify to frameworks 13341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.type = CAMERA3_MSG_SHUTTER; 13351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.message.shutter.frame_number = i->frame_number; 1336e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang notify_msg.message.shutter.timestamp = current_capture_time; 13371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1338a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__, 1339e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i->frame_number, capture_time); 13401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 13411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send empty metadata with already filled buffers for dropped metadata 13421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // and send valid metadata with already filled buffers for current metadata 13431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i->frame_number < frame_number) { 134499b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang CameraMetadata dummyMetadata; 134599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP, 1346e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ¤t_capture_time, 1); 134799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_REQUEST_ID, 134874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab &(i->request_id), 1); 134999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang result.result = dummyMetadata.release(); 13501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 1351e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.result = translateCbMetadataToResultMetadata(metadata, 135274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab current_capture_time, i->request_id); 1353d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (mIsZslMode) { 1354d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int found_metadata = 0; 1355d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //for ZSL case store the metadata buffer and corresp. ZSL handle ptr 1356d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1357d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab j != i->buffers.end(); j++) { 1358d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (j->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1359d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //check if corresp. zsl already exists in the stored metadata list 1360d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1361d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.begin(); m++) { 1362d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->frame_number == frame_number) { 1363d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m->meta_buf = metadata_buf; 1364d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found_metadata = 1; 1365d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1366d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1367d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1368d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found_metadata) { 1369d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo store_meta_info; 1370d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab store_meta_info.meta_buf = metadata_buf; 1371d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab store_meta_info.frame_number = frame_number; 1372d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mStoredMetadataList.push_back(store_meta_info); 1373d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found_metadata = 1; 1374d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1375d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1376d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1377d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found_metadata) { 137813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab if (!i->input_buffer_present && i->blob_request) { 137913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab //livesnapshot or fallback non-zsl snapshot case 138013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 138113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab j != i->buffers.end(); j++){ 138213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab if (j->stream->stream_type == CAMERA3_STREAM_OUTPUT && 138313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab j->stream->format == HAL_PIXEL_FORMAT_BLOB) { 138441da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true); 138513c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab break; 138613c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 138713c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 138813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } else { 138913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab //return the metadata immediately 139013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab mMetadataChannel->bufDone(metadata_buf); 139113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab free(metadata_buf); 139213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 1393d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1394d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else if (!mIsZslMode && i->blob_request) { 13957ee407aa1024789089aad411c372c79423699976Ajay Dudani //If it is a blob request then send the metadata to the picture channel 139641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true); 1397d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else { 13987ee407aa1024789089aad411c372c79423699976Ajay Dudani // Return metadata buffer 13997ee407aa1024789089aad411c372c79423699976Ajay Dudani mMetadataChannel->bufDone(metadata_buf); 14007ee407aa1024789089aad411c372c79423699976Ajay Dudani free(metadata_buf); 1401d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1402d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab 14031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result.result) { 14051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: metadata is NULL", __func__); 14061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.frame_number = i->frame_number; 14081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 0; 1409e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.output_buffers = NULL; 14101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1411e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 14121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 14131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers++; 14141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 14171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (result.num_output_buffers > 0) { 14181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_stream_buffer_t *result_buffers = 14191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole new camera3_stream_buffer_t[result.num_output_buffers]; 14201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result_buffers) { 14211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Fatal error: out of memory", __func__); 14221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole size_t result_buffers_idx = 0; 14241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1425e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 14261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 14271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result_buffers[result_buffers_idx++] = *(j->buffer); 14281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free(j->buffer); 142913dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang j->buffer = NULL; 14301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(j->stream)--; 14311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = result_buffers; 14341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 14351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1436a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: meta frame_number = %d, capture_time = %lld", 1437d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 14381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 14391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete[] result_buffers; 14401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 14411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1442ba7843eb48941909a360512af9d0596790d7d887Iliyan Malchev ALOGV("%s: meta frame_number = %d, capture_time = %lld", 1443d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 14441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 14451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // erase the element from the list 14471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i = mPendingRequestsList.erase(i); 14481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 144933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 145033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 14511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata: 14521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole bool max_buffers_dequeued = false; 14531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < mPendingBuffersMap.size(); i++) { 14541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i); 1455e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang uint32_t queued_buffers = mPendingBuffersMap.valueAt(i); 14561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (queued_buffers == stream->max_buffers) { 14571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole max_buffers_dequeued = true; 14581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole break; 14591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1461152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang if (!max_buffers_dequeued && !pending_requests) { 14621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Unblock process_capture_request 14631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequest = 0; 14641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_cond_signal(&mRequestCond); 14651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 14671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // If the frame number doesn't exist in the pending request list, 14681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // directly send the buffer to the frameworks, and update pending buffers map 14691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Otherwise, book-keep the buffer. 14701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1471c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang while (i != mPendingRequestsList.end() && i->frame_number != frame_number){ 14721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i++; 1473c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 14741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i == mPendingRequestsList.end()) { 14751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Verify all pending requests frame_numbers are greater 14761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin(); 1477e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != mPendingRequestsList.end(); j++) { 14781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->frame_number < frame_number) { 14791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: pending frame number %d is smaller than %d", 14801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole __func__, j->frame_number, frame_number); 14811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 14841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.result = NULL; 148533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang result.frame_number = frame_number; 14861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 1; 14871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = buffer; 1488a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: result frame_number = %d, buffer = %p", 1489e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, frame_number, buffer); 14901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(buffer->stream)--; 1491d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (buffer->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1492d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int found = 0; 1493d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator k = mStoredMetadataList.begin(); 1494d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab k != mStoredMetadataList.end(); k++) { 1495d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (k->frame_number == frame_number) { 1496d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab k->zsl_buf_hdl = buffer->buffer; 1497d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found = 1; 1498d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1499d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1500d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1501d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found) { 1502d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo meta_info; 1503d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab meta_info.frame_number = frame_number; 1504d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab meta_info.zsl_buf_hdl = buffer->buffer; 1505d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mStoredMetadataList.push_back(meta_info); 1506d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1507d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1508e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 150933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } else { 15101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1511e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 15121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->stream == buffer->stream) { 15131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer != NULL) { 15141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: buffer is already set", __func__); 15151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 15161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole j->buffer = (camera3_stream_buffer_t *)malloc( 15171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(camera3_stream_buffer_t)); 15181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole *(j->buffer) = *buffer; 1519a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: cache buffer %p at result frame_number %d", 1520e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, buffer, frame_number); 15211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 15221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 15231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1524e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 15259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 15265b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_unlock(&mMutex); 15279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 15289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 15299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 153097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 153197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : translateCbMetadataToResultMetadata 153297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 153397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: 153497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 153597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 153697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @metadata : metadata information from callback 153797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 153897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN : camera_metadata_t* 153997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * metadata in a format specified by fwk 154097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 154197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* 154297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata 154374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab (metadata_buffer_t *metadata, nsecs_t timestamp, 154474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id) 154597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 154697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata camMetadata; 154797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camera_metadata_t* resultMetadata; 154897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); 155074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1); 155197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15523e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t curr_entry = GET_FIRST_PARAM_ID(metadata); 15533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t next_entry; 15543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang while (curr_entry != CAM_INTF_PARM_MAX) { 15553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang ALOGV("%s: META_DEBUG: cur_entry is %d", __func__, curr_entry); 15563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang switch (curr_entry) { 15573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_FACE_DETECTION:{ 15583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_face_detection_data_t *faceDetectionInfo = 15593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (cam_face_detection_data_t *)POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata); 15603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t numFaces = faceDetectionInfo->num_faces_detected; 15613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t faceIds[numFaces]; 15623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t faceScores[numFaces]; 15633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t faceRectangles[numFaces * 4]; 15643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t faceLandmarks[numFaces * 6]; 15653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int j = 0, k = 0; 15663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang for (int i = 0; i < numFaces; i++) { 15673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang faceIds[i] = faceDetectionInfo->faces[i].face_id; 15683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang faceScores[i] = faceDetectionInfo->faces[i].score; 15693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang convertToRegions(faceDetectionInfo->faces[i].face_boundary, 15703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang faceRectangles+j, -1); 15713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k); 15723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang j+= 4; 15733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang k+= 6; 15743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 15753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang if (numFaces > 0) { 15763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces); 15773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces); 15783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES, 15793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang faceRectangles, numFaces*4); 15803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS, 15813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang faceLandmarks, numFaces*6); 15823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 15833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 15843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 15853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_COLOR_CORRECT_MODE:{ 15863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *color_correct_mode = 15873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata); 15883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1); 15893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 15903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 15913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AEC_PRECAPTURE_ID: { 15923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t *ae_precapture_id = 15933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata); 15943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1); 15953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 15963e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 15973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AEC_ROI: { 15983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_area_t *hAeRegions = 15993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata); 16003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t aeRegions[5]; 16013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight); 16023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5); 16033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AEC_STATE:{ 16063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *ae_state = 16073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata); 16083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1); 16093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_PARM_FOCUS_MODE:{ 16123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *focusMode = 16133e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata); 1614867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang uint8_t fwkAfMode = lookupFwkName(FOCUS_MODES_MAP, 1615867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), *focusMode); 1616867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AF_MODE, &fwkAfMode, 1); 16173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AF_ROI:{ 16203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang /*af regions*/ 16213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_area_t *hAfRegions = 16223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata); 16233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t afRegions[5]; 16243e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight); 16253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5); 16263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AF_STATE: { 16293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata); 16303e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1); 16313e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16323e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16333e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AF_TRIGGER_ID: { 16343e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t *afTriggerId = 16353e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata); 16363e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1); 16373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16393e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_PARM_WHITE_BALANCE: { 16403e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *whiteBalance = 16413e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata); 1642867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang uint8_t fwkWhiteBalanceMode = lookupFwkName(WHITE_BALANCE_MODES_MAP, 1643867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 1644867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang *whiteBalance); 1645867ab9fde22765039b15b11d630fc99933abd244Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AWB_MODE, &fwkWhiteBalanceMode, 1); 16463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AWB_REGIONS: { 16493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang /*awb regions*/ 16503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_area_t *hAwbRegions = 16513e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata); 16523e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t awbRegions[5]; 16533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight); 16543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5); 16553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_AWB_STATE: { 16583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *whiteBalanceState = 16593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata); 16603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1); 16613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_MODE: { 16643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata); 16653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_CONTROL_MODE, mode, 1); 16663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_EDGE_MODE: { 16693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE_MODE, metadata); 16703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1); 16713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_FLASH_POWER: { 16743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *flashPower = 16753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata); 16763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1); 16773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_FLASH_FIRING_TIME: { 16803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int64_t *flashFiringTime = 16813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata); 16823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1); 16833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_FLASH_STATE: { 16863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *flashState = 16873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata); 16883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_FLASH_STATE, flashState, 1); 16893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_HOTPIXEL_MODE: { 16923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *hotPixelMode = 16933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata); 16943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1); 16953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 16963e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 16973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_APERTURE:{ 16983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang float *lensAperture = 16993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata); 17003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1); 17013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_FILTERDENSITY: { 17043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang float *filterDensity = 17053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata); 17063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1); 17073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_FOCAL_LENGTH:{ 17103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang float *focalLength = 17113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata); 17123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1); 17133e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17143e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17153e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_FOCUS_DISTANCE: { 17163e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang float *focusDistance = 17173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata); 17183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1); 17193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_FOCUS_RANGE: { 17223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang float *focusRange = 17233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata); 172432d9e5ad33dd580b6273aac830ef99f913a0ce0bAjay Dudani camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 2); 17253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_OPT_STAB_MODE: { 17273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *opticalStab = 17283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata); 17293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1); 17303e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17313e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_NOISE_REDUCTION_MODE: { 17323e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *noiseRedMode = 17333e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata); 17343e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1); 17353e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17363e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SCALER_CROP_REGION: { 17383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_crop_region_t *hScalerCropRegion =(cam_crop_region_t *) 17393e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata); 17403e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t scalerCropRegion[4]; 17413e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang scalerCropRegion[0] = hScalerCropRegion->left; 17423e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang scalerCropRegion[1] = hScalerCropRegion->top; 17433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang scalerCropRegion[2] = hScalerCropRegion->width; 17443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang scalerCropRegion[3] = hScalerCropRegion->height; 17453e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4); 17463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SENSOR_EXPOSURE_TIME:{ 17493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int64_t *sensorExpTime = 17503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata); 17513e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang mMetadataResponse.exposure_time = *sensorExpTime; 17523e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang ALOGV("%s: sensorExpTime = %lld", __func__, *sensorExpTime); 17533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1); 17543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SENSOR_FRAME_DURATION:{ 17573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int64_t *sensorFameDuration = 17583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata); 17593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang ALOGV("%s: sensorFameDuration = %lld", __func__, *sensorFameDuration); 17603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1); 17613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SENSOR_SENSITIVITY:{ 17643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int32_t *sensorSensitivity = 17653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata); 17663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang ALOGV("%s: sensorSensitivity = %d", __func__, *sensorSensitivity); 17673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang mMetadataResponse.iso_speed = *sensorSensitivity; 17683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1); 17693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SHADING_MODE: { 17723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *shadingMode = 17733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata); 17743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1); 17753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_STATS_FACEDETECT_MODE: { 17783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *faceDetectMode = 17793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata); 17803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t fwk_faceDetectMode = lookupFwkName(FACEDETECT_MODES_MAP, 17813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]), 17823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang *faceDetectMode); 17833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1); 17843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17853e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17863e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_STATS_HISTOGRAM_MODE: { 17873e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *histogramMode = 17883e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata); 17893e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1); 17903e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17913e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17923e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_STATS_SHARPNESS_MAP_MODE:{ 17933e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *sharpnessMapMode = 17943e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata); 17953e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 17963e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang sharpnessMapMode, 1); 17973e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 17983e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 17993e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_STATS_SHARPNESS_MAP:{ 18003e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_sharpness_map_t *sharpnessMap = (cam_sharpness_map_t *) 18013e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata); 18023e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP, 18033e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (int32_t*)sharpnessMap->sharpness, 18043e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT); 18053e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18063e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18073e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_LENS_SHADING_MAP: { 18083e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *) 18093e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_LENS_SHADING_MAP, metadata); 18103e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height; 18113e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang int map_width = gCamCapability[mCameraId]->lens_shading_map_size.width; 18123e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP, 18133e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float*)lensShadingMap->lens_shading, 18143e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang 4*map_width*map_height); 18153e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18163e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18173e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_TONEMAP_CURVES:{ 18183e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang //Populate CAM_INTF_META_TONEMAP_CURVES 18193e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang /* ch0 = G, ch 1 = B, ch 2 = R*/ 18203e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_rgb_tonemap_curves *tonemap = (cam_rgb_tonemap_curves *) 18213e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_TONEMAP_CURVES, metadata); 18223e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_TONEMAP_CURVE_GREEN, 18233e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float*)tonemap->curves[0].tonemap_points, 18243e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang tonemap->tonemap_points_cnt * 2); 18253e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang 18263e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_TONEMAP_CURVE_BLUE, 18273e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float*)tonemap->curves[1].tonemap_points, 18283e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang tonemap->tonemap_points_cnt * 2); 18293e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang 18303e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_TONEMAP_CURVE_RED, 18313e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (float*)tonemap->curves[2].tonemap_points, 18323e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang tonemap->tonemap_points_cnt * 2); 18333e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18343e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18353e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_COLOR_CORRECT_GAINS:{ 18363e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*) 18373e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata); 18383e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4); 18393e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18403e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18413e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_COLOR_CORRECT_TRANSFORM:{ 18423e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*) 18433e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata); 18443e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM, 1845d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3); 18463e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18473e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18483e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_PRED_COLOR_CORRECT_GAINS:{ 18493e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*) 18503e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata); 18513e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS, 1852d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy predColorCorrectionGains->gains, 4); 18533e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18543e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18553e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM:{ 18563e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*) 18573e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata); 18583e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM, 18593e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3); 18603e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18613e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang 18623e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18633e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_BLACK_LEVEL_LOCK:{ 18643e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *blackLevelLock = (uint8_t*) 18653e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata); 18663e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1); 18673e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18683e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18693e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_META_SCENE_FLICKER:{ 18703e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang uint8_t *sceneFlicker = (uint8_t*) 18713e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang POINTER_OF(CAM_INTF_META_SCENE_FLICKER, metadata); 18723e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1); 18733e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18743e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18753e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang case CAM_INTF_PARM_LED_MODE: 18763e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18773e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang default: 18783e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang ALOGV("%s: This is not a valid metadata type to report to fwk, %d", 18793e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang __func__, curr_entry); 18803e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang break; 18813e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 18823e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang next_entry = GET_NEXT_PARAM_ID(curr_entry, metadata); 18833e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang curr_entry = next_entry; 18843e500ec5abf1463c32e0a783bb63802954005dd8Shuzhen Wang } 188597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole resultMetadata = camMetadata.release(); 188633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return resultMetadata; 188797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 188897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 188997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 189059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertToRegions 189197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 189297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array 189397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 189497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 189597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @rect : cam_rect_t struct to convert 189697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @region : int32_t destination array 189797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @weight : if we are converting from cam_area_t, weight is valid 189897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * else weight = -1 189997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 190097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 190159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){ 190297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[0] = rect.left; 190397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[1] = rect.top; 190459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[2] = rect.left + rect.width; 190559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[3] = rect.top + rect.height; 190697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (weight > -1) { 190797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[4] = weight; 190897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 190997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 191059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 191159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*=========================================================================== 191259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertFromRegions 191359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 191459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t 191559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 191659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS : 191759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @rect : cam_rect_t struct to convert 191859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @region : int32_t destination array 191959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @weight : if we are converting from cam_area_t, weight is valid 192059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * else weight = -1 192159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 192259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/ 192359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi, 192459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang const camera_metadata_t *settings, 192559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang uint32_t tag){ 192659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang CameraMetadata frame_settings; 192759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang frame_settings = settings; 192859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_min = frame_settings.find(tag).data.i32[0]; 192959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_min = frame_settings.find(tag).data.i32[1]; 193059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_max = frame_settings.find(tag).data.i32[2]; 193159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_max = frame_settings.find(tag).data.i32[3]; 193259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->weight = frame_settings.find(tag).data.i32[4]; 193359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.left = x_min; 193459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.top = y_min; 193559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.width = x_max - x_min; 193659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.height = y_max - y_min; 193759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang} 193859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 193997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 194071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION : resetIfNeededROI 194171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 194271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler 194371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * crop region 194471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 194571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS : 194671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @roi : cam_area_t struct to resize 194771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @scalerCropRegion : cam_crop_region_t region to compare against 194871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 194971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 195071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/ 195171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi, 195271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang const cam_crop_region_t* scalerCropRegion) 195371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{ 195471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_x_max = roi->rect.width + roi->rect.left; 195571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_y_max = roi->rect.height + roi->rect.top; 195671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top; 195771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left; 195871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if ((roi_x_max < scalerCropRegion->left) || 195971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi_y_max < scalerCropRegion->top) || 196071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.left > crop_x_max) || 196171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.top > crop_y_max)){ 196271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return false; 196371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 196471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.left < scalerCropRegion->left) { 196571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.left = scalerCropRegion->left; 196671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 196771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.top < scalerCropRegion->top) { 196871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.top = scalerCropRegion->top; 196971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 197071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_x_max > crop_x_max) { 197171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_x_max = crop_x_max; 197271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 197371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_y_max > crop_y_max) { 197471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_y_max = crop_y_max; 197571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 197671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.width = roi_x_max - roi->rect.left; 197771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.height = roi_y_max - roi->rect.top; 197871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return true; 197971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang} 198071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang 198171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*=========================================================================== 198297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : convertLandmarks 198397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 198497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info 198597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 198697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 198797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @face : cam_rect_t struct to convert 198897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @landmarks : int32_t destination array 198997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 199097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 199197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 199297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks) 199397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 199497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[0] = face.left_eye_center.x; 199597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[1] = face.left_eye_center.y; 199697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[2] = face.right_eye_center.y; 199797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[3] = face.right_eye_center.y; 199897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[4] = face.mouth_center.x; 199997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[5] = face.mouth_center.y; 200097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 200197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 2002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 2003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2004625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 2005625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2006625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 2007625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2008625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2009625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2010625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 2013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 2014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 2016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 2018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 2019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 2020625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2021625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 2022625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 2023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 2024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 2025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 2026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2028e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 2029e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (capabilityHeap == NULL) { 2030e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: creation of capabilityHeap failed", __func__); 2031e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang goto heap_creation_failed; 2032e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 2033625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 2034625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 2035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 2036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 2037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 2038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 2041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 2042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 2043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 2044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 2045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 2046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 2047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 2048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 2049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 2052625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 2053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 2054625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 2055625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 2056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 2058625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 2059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 2060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 2061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 2063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 2064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 2065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 2067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 2068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 2069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 2070625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 2071625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 2072e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete capabilityHeap; 2073e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed: 2074625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 2075625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 2076625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 2077625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2078625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2080625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2081662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : initParameters 2082662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2083662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters 2084662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2085662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2086662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2087662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2088662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 2089662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2090662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2091662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters() 2092662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2093662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 2094662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2095662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Allocate Set Param Buffer 2096662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = new QCamera3HeapMemory(); 2097662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 2098662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc != OK) { 2099662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = NO_MEMORY; 2100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("Failed to allocate SETPARM Heap memory"); 2101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 2102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 2103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 2104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Map memory for parameters buffer 2107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 2108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole CAM_MAPPING_BUF_TYPE_PARM_BUF, 2109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->getFd(0), 2110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(parm_buffer_t)); 2111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc < 0) { 2112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:failed to map SETPARM buffer",__func__); 2113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = FAILED_TRANSACTION; 2114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->deallocate(); 2115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 2116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 2117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 2118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2120662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0); 2121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 2122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 212533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION : deinitParameters 212633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 212733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters 212833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 212933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS : 213033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 213133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN : NONE 213233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/ 213333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters() 213433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{ 213533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 213633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF); 213733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 213833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap->deallocate(); 213933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang delete mParamHeap; 214033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap = NULL; 214133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 214233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters = NULL; 214333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang} 214433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 214533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*=========================================================================== 21460a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION : calcMaxJpegSize 21470a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 21480a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId 21490a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 21500a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS : 21510a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 21520a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN : max_jpeg_size 21530a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/ 21540a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize() 21550a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{ 21560a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int32_t max_jpeg_size = 0; 21570a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int temp_width, temp_height; 21580a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 21590a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width; 21600a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height; 21610a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab if (temp_width * temp_height > max_jpeg_size ) { 21620a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = temp_width * temp_height; 21630a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 21640a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 21650a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 21660a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab return max_jpeg_size; 21670a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab} 21680a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab 21690a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*=========================================================================== 2170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 2171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 2173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 2179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 2180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 2182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 218497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata staticInfo; 2185c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 2186c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang /* android.info: hardware level */ 2187c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL; 2188c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, 2189c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &supportedHardwareLevel, 1); 2190c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 2191662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK; 2192662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 3 only*/ 21932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 21942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); */ 21952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2196e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang /*hard coded for now but this should come from sensor*/ 2197e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang float min_focus_distance; 2198e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if(facingBack){ 2199e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 10; 2200e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2201e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 0; 2202e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 22042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &min_focus_distance, 1); 2205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 2207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 2208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2209c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*should be using focal lengths but sensor doesn't provide that info now*/ 2210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 2211c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &gCamCapability[cameraId]->focal_length, 2212c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1); 2213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 2215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 2216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 2217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 2219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 2220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 2221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 2224c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)gCamCapability[cameraId]->optical_stab_modes, 2225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 2226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 222780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 222880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 222980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 223080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 223147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 223280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 223380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 223480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 223580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 2236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 223747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 22380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->geo_correction_map_size.height}; 223980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 224080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 224180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 224280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 224380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 224480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 2245c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float)); 224680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 224780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 224880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 224980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 225080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 225180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 225280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 225380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 225480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 225580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 225665fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang camera_metadata_rational baseGainFactor = { 225765fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang gCamCapability[cameraId]->base_gain_factor.numerator, 225865fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang gCamCapability[cameraId]->base_gain_factor.denominator}; 225965fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang staticInfo.update(ANDROID_SENSOR_BASE_GAIN_FACTOR, 226065fead1569def915ae55986392c5ee9bcca5ff93Shuzhen Wang &baseGainFactor, 1); 226180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 226280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 2263c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1); 226480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 226547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 226680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 226780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 226880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 226980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 227022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t active_array_size[] = {0, 0, 227122817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala gCamCapability[cameraId]->active_array_size.width, 227280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 227380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 227422817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala active_array_size, 4); 227580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 227680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 227780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 2278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 227980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 228080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 228180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 228280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 228380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 228480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 228580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 228680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 228780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 228880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 22896990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang (int*)&gCamCapability[cameraId]->max_num_roi, 1); 229080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 229180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 229280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 229380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 229480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 229580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 229680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 229747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 229880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 229980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 230080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 230180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 230280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 230380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 230480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 230580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 230680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 230780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 230880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 230980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 231080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 231122817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888, 231222817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB}; 231322817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t); 2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats, 23168867984d33ed870071109a4500402dddbc85c048Shuzhen Wang scalar_formats_count); 2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 231847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_processed_sizes[CAM_FORMAT_MAX * 2]; 231900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang makeTable(gCamCapability[cameraId]->picture_sizes_tbl, 232000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt, 2321662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes); 2322662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2323662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes, 232400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2); 232500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 2326e936796df0426c326d043c2359c149024526f4bcShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, 232700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 232800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 23290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 233047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_fps_ranges[MAX_SIZES_CNT * 2]; 23310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl, 23320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->fps_ranges_tbl_cnt, 23330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole available_fps_ranges); 2334c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2335c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) ); 2336c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 233747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang camera_metadata_rational exposureCompensationStep = { 2338c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.numerator, 2339c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.denominator}; 2340c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 2341c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &exposureCompensationStep, 1); 2342c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2343c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*TO DO*/ 234447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF}; 2345c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 2346c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableVstabModes, sizeof(availableVstabModes)); 2347c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2348b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang /*HAL 1 and HAL 3 common*/ 23499443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab float maxZoom = 4; 2350c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 2351c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &maxZoom, 1); 2352c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 235347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max3aRegions = 1; 2354c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_MAX_REGIONS, 2355c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &max3aRegions, 1); 2356c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 235747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableFaceDetectModes[] = { 23586990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, 23596990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_FULL }; 2360c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 2361c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableFaceDetectModes, 2362c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(availableFaceDetectModes)); 2363c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 236447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width, 2365662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->raw_dim.height}; 2366662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 2367662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole raw_size, 2368662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(raw_size)/sizeof(uint32_t)); 2369662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 237047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 237180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 237280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 237380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 237480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 237580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 2376662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint8_t lensFacing = (facingBack) ? 237780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 237880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 2379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2380662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 238100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang available_processed_sizes, 2382c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2)); 2383c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2384c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 238508ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab available_thumbnail_sizes, 238608ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab sizeof(available_thumbnail_sizes)/sizeof(int32_t)); 2387662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 238847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max_jpeg_size = 0; 238997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int temp_width, temp_height; 239097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 239197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width; 239297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height; 239397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (temp_width * temp_height > max_jpeg_size ) { 239497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = temp_width * temp_height; 239597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 239697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 239797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 239897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole staticInfo.update(ANDROID_JPEG_MAX_SIZE, 239997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole &max_jpeg_size, 1); 240097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 240147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_effects[CAM_EFFECT_MODE_MAX]; 24020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t size = 0; 2403662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) { 24040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(EFFECT_MODES_MAP, 2405b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]), 24060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_effects[i]); 24070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 24080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_effects[size] = (uint8_t)val; 24090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 24100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2411662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2412662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 2413662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_effects, 24140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2415662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 241647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX]; 2417e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t supported_indexes[CAM_SCENE_MODE_MAX]; 24182dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang int32_t supported_scene_modes_cnt = 0; 2419662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) { 24200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(SCENE_MODES_MAP, 2421b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 24220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_scene_modes[i]); 24230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 2424e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val; 2425e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_indexes[supported_scene_modes_cnt] = i; 24262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt++; 24270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2428662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2429e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2430662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 2431662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_scene_modes, 24322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt); 2433662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 243447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3]; 2435e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides, 2436e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt, 2437e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 24389443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supported_indexes, 24399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab cameraId); 2440e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 2441e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 2442e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt*3); 2443e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 244447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX]; 24450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) { 24470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(ANTIBANDING_MODES_MAP, 2448b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 2449b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[cameraId]->supported_antibandings[i]); 24500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 24510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_antibanding_modes[size] = (uint8_t)val; 24520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 24530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 2457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_antibanding_modes, 24580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 246047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX]; 24610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) { 24630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FOCUS_MODES_MAP, 2464b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 24650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_focus_modes[i]); 24660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 24670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_af_modes[size] = (uint8_t)val; 24680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 24690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2470662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2471662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 2472662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_af_modes, 24730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2474662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 247547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_awb_modes[CAM_WB_MODE_MAX]; 24760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) { 24780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP, 2479b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 24800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_white_balances[i]); 24810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 24820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_awb_modes[size] = (uint8_t)val; 24830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 24840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2485662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2486662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 2487662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_awb_modes, 24880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2489662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2490a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX]; 2491a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++) 2492a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i]; 2493a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava 2494a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava staticInfo.update(ANDROID_FLASH_FIRING_POWER, 2495a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava available_flash_levels, 2496a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava gCamCapability[cameraId]->supported_flash_firing_level_cnt); 2497a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava 2498662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 249900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang uint8_t flashAvailable = gCamCapability[cameraId]->flash_available; 2500e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE, 2501e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang &flashAvailable, 1); 2502e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2503e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t avail_ae_modes[5]; 2504e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size = 0; 2505e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) { 2506e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i]; 2507e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size++; 2508e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2509e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (flashAvailable) { 2510e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; 2511e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; 2512e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; 2513e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2514662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 2515662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_ae_modes, 2516e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size); 2517ea44a483c0e98200c058a85ea339457616516847Zhijun He 2518e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t sensitivity_range[2]; 2519e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity; 2520e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity; 2521ea44a483c0e98200c058a85ea339457616516847Zhijun He staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, 2522ea44a483c0e98200c058a85ea339457616516847Zhijun He sensitivity_range, 2523ea44a483c0e98200c058a85ea339457616516847Zhijun He sizeof(sensitivity_range) / sizeof(int32_t)); 25242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 252573c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, 252673c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy &gCamCapability[cameraId]->max_analog_sensitivity, 252700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 1); 252800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 252973c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 2530e936796df0426c326d043c2359c149024526f4bcShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 2531e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 253273c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy 253300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle; 253400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang staticInfo.update(ANDROID_SENSOR_ORIENTATION, 253500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang &sensor_orientation, 253600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 1); 253700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 253800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang int32_t max_output_streams[3] = {1, 3, 1}; 253900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, 254000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang max_output_streams, 254100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 3); 254200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 2543b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang gStaticMetadata[cameraId] = staticInfo.release(); 2544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2548662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : makeTable 2549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes 2551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2552662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2553662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2554662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2555662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2556662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size, 2557662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t* sizeTable) 2558662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2559662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int j = 0; 2560662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < size; i++) { 2561662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j] = dimTable[i].width; 2562662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j+1] = dimTable[i].height; 2563662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole j+=2; 2564662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2565662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 25660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*=========================================================================== 25680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : makeFPSTable 25690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 25700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges 25710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 25720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS : 25730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 25740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/ 25750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size, 2576c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang int32_t* fpsRangesTable) 25770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{ 25780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int j = 0; 25790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < size; i++) { 2580c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps; 2581c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps; 25820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole j+=2; 25830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole} 25852dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 25862dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*=========================================================================== 25872dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION : makeOverridesList 25882dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 25892dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides 25902dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 25912dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS : 25922dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 25932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 25942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/ 25952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable, 2596e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t size, uint8_t* overridesList, 25979443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t* supported_indexes, 25989443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int camera_id) 25992dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{ 26002dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*daemon will give a list of overrides for all scene modes. 26012dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang However we should send the fwk only the overrides for the scene modes 26022dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported by the framework*/ 26039443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int j = 0, index = 0, supt = 0; 26049443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t focus_override; 26052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang for (int i = 0; i < size; i++) { 26069443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 0; 2607e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang index = supported_indexes[i]; 2608e310738e63535838ed4659a55d540b75abc84c19Ajay Dudani overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON; 26099443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP, 26109443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 26119443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesTable[index].awb_mode); 26129443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override = (uint8_t)overridesTable[index].af_mode; 26139443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) { 26149443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) { 26159443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 1; 26169443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab break; 26179443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 26189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 26199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (supt) { 26209443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP, 26219443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 26229443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override); 26239443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } else { 26249443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF; 26259443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 26262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang j+=3; 26272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang } 26282dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang} 26292dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2630662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : getPreviewHalPixelFormat 2632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework 2634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2635662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend 2636662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2637662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN : format recognized by framework 2638662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2639662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2640662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format) 2641662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2642662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t halPixelFormat; 2643662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2644662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole switch (format) { 2645662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV12: 2646662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; 2647662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2648662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21: 2649662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2650662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2651662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21_ADRENO: 2652662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO; 2653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2654662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_YV12: 2655662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YV12; 2656662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2657662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV16: 2658662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV61: 2659662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole default: 2660662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2661662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2662662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2663662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return halPixelFormat; 2664662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2665662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2666662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 26673fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION : getSensorSensitivity 26683fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 26693fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value 26703fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 26713fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor 26723fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 26733fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN : sensitivity supported by sensor 26743fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 26753fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/ 26763fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode) 26773fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{ 26783fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang int32_t sensitivity; 26793fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 26803fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang switch (iso_mode) { 26813fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_100: 26823fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 100; 26833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 26843fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_200: 26853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 200; 26863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 26873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_400: 26883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 400; 26893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 26903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_800: 26913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 800; 26923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 26933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_1600: 26943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 1600; 26953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 26963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang default: 26973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = -1; 26983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 26993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 27003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang return sensitivity; 27013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang} 27023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 27033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 27043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*=========================================================================== 2705662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : AddSetParmEntryToBatch 2706662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2707662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch 2708662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2709662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2710662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @p_table : ptr to parameter buffer 2711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramType : parameter type 2712662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramLength : length of parameter value 2713662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramValue : ptr to parameter value 2714662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2715662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2716662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 2717662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2718662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2719662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table, 2720662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole cam_intf_parm_type_t paramType, 2721662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint32_t paramLength, 2722662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole void *paramValue) 2723662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2724662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int position = paramType; 2725662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int current, next; 2726662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2727662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2728662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Code to take care of linking next flags * 2729662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2730662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_FIRST_PARAM_ID(p_table); 2731662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position == current){ 2732662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //DO NOTHING 2733662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else if (position < current){ 2734662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, current); 2735662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_FIRST_PARAM_ID(p_table, position); 2736662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 2737662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /* Search for the position in the linked list where we need to slot in*/ 2738662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole while (position > GET_NEXT_PARAM_ID(current, p_table)) 2739662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_NEXT_PARAM_ID(current, p_table); 2740662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2741662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*If node already exists no need to alter linking*/ 2742662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position != GET_NEXT_PARAM_ID(current, p_table)) { 2743662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole next = GET_NEXT_PARAM_ID(current, p_table); 2744662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(current, p_table, position); 2745662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, next); 2746662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2747662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2748662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2749662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2750662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Copy contents into entry * 2751662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2752662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2753662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (paramLength > sizeof(parm_type_t)) { 2754662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:Size of input larger than max entry size",__func__); 2755662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2756662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2757662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength); 2758662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NO_ERROR; 2759662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2760662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2761662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2762662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupFwkName 2763662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2764662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2765662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2766662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2767662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2768662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2769662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2770662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @hal_name : name of the hal_parm to map 2771662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2772662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int type of status 2773662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * fwk_name -- success 2774662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2775662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 27760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[], 2777662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int hal_name) 2778662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2779662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2780d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (int i = 0; i < len; i++) { 2781d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang if (arr[i].hal_name == hal_name) 2782d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return arr[i].fwk_name; 2783662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2784d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 2785d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* Not able to find matching framework type is not necessarily 2786d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * an error case. This happens when mm-camera supports more attributes 2787d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * than the frameworks do */ 2788d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Cannot find matching framework type", __func__); 2789d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return NAME_NOT_FOUND; 2790662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2791662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2792662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2793662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupHalName 2794662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2795662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2796662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2797662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2798662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2799662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2800662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2801662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @fwk_name : name of the hal_parm to map 2802662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2803662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2804662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * hal_name -- success 2805662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2806662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 28070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[], 2808662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int fwk_name) 2809662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2810662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 2811662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].fwk_name == fwk_name) 2812662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].hal_name; 2813662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 28140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Cannot find matching hal type", __func__); 2815662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NAME_NOT_FOUND; 2816662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2817662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2818662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2819625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 2820625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 2822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 2826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 2829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 2830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 2832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 2833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 2835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 2837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 2838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 2840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2844b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang if (NULL == gStaticMetadata[cameraId]) { 2845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 2846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 2852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 2853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 2854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 2857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 2858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 2862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 2863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 2868c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang info->device_version = CAMERA_DEVICE_API_VERSION_3_0; 2869b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang info->static_camera_characteristics = gStaticMetadata[cameraId]; 2870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 2876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 2878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 2880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 2883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 2884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 288697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type) 2887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 2889e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 2891e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2893625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 2895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 289697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata settings; 2897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 2898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 2899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 29006be371a43545858396aed73240eaa1259df60d2dShuzhen Wang int32_t defaultRequestID = 0; 29016be371a43545858396aed73240eaa1259df60d2dShuzhen Wang settings.update(ANDROID_REQUEST_ID, &defaultRequestID, 1); 2902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 2904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 2906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 2907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 2908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 2909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 2911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 2912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 2914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 2915625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2916625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 2917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 2918625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2919625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 2920625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 2921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2922625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2923625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 2924625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2925625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2926625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 2927625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 29289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 29299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 2930625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2931625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 2932625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 2933625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 2935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 2936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2937625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 2938625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 2939625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2940625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 2941625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 2942625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2943625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 2944625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 2945625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2946625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 2947625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 2948625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2949e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t focusMode; 2950e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) { 2951e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to auto", __func__); 2952e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_AUTO; 2953e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2954e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to off", __func__); 2955e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_OFF; 2956e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 29572dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1); 29582dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 29592dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; 29602dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 29612dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 2963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 2964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 2965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2966a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4; 2967a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava settings.update(ANDROID_FLASH_FIRING_POWER, 2968a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava &flashFiringLevel, 1); 2969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 297147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_aperture = gCamCapability[mCameraId]->apertures[0]; 2972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 2973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2974b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang if (gCamCapability[mCameraId]->filter_densities_count) { 297547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 2976b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 2977b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[mCameraId]->filter_densities_count); 2978b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang } 2979625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 29809a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang float default_focal_length = gCamCapability[mCameraId]->focal_length; 29819a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 2982625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2983e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang /* Exposure time(Update the Min Exposure Time)*/ 2984e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang int64_t default_exposure_time = gCamCapability[mCameraId]->exposure_time_range[0]; 2985e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang settings.update(ANDROID_SENSOR_EXPOSURE_TIME, &default_exposure_time, 1); 2986e407efbfc8d1daaa5f0c73eb4130de79c9420a6cShuzhen Wang 298762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang /* frame duration */ 2988f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const int64_t default_frame_duration = NSEC_PER_33MSEC; 298962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang settings.update(ANDROID_SENSOR_FRAME_DURATION, &default_frame_duration, 1); 299062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 299162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang /* sensitivity */ 2992f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const int32_t default_sensitivity = 100; 299362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1); 299462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 2995f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang /*edge mode*/ 2996f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const uint8_t edge_mode = ANDROID_EDGE_MODE_HIGH_QUALITY; 2997f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang settings.update(ANDROID_EDGE_MODE, &edge_mode, 1); 2998f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang 2999f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang /*noise reduction mode*/ 3000f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const uint8_t noise_red_mode = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY; 3001f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang settings.update(ANDROID_NOISE_REDUCTION_MODE, &noise_red_mode, 1); 3002f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang 3003f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang /*color correction mode*/ 3004f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const uint8_t color_correct_mode = ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY; 3005f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang settings.update(ANDROID_COLOR_CORRECTION_MODE, &color_correct_mode, 1); 3006f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang 3007f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang /*transform matrix mode*/ 3008f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang static const uint8_t tonemap_mode = ANDROID_TONEMAP_MODE_HIGH_QUALITY; 3009f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang settings.update(ANDROID_TONEMAP_MODE, &tonemap_mode, 1); 3010f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang 30114e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang int32_t edge_strength = gCamCapability[mCameraId]->sharpness_ctrl.def_value; 30124e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang settings.update(ANDROID_EDGE_STRENGTH, &edge_strength, 1); 30134e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang 3014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 3015e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3016e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 3017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 3018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3020625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 302180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 302280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 302380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 302480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 302580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 302680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 302762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * @request : request that needs to be serviced 302834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * @streamTypeMask : bit mask of stream types on which buffers are requested 302980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 303080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 303180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 303280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 303362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(camera3_capture_request_t *request, 303462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang uint32_t streamTypeMask) 303580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 303680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 303780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 303862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (request->settings == NULL && mFirstRequest) { 303980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 304080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 3041662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 304233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 3043b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 3044b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang 3045b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 304633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 304762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 3048b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(hal_version), &hal_version); 304962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (rc < 0) { 305062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGE("%s: Failed to set hal version in the parameters", __func__); 305162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return BAD_VALUE; 305262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 305333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 3054662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*we need to update the frame number in the parameters*/ 3055662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 305662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang sizeof(request->frame_number), &(request->frame_number)); 3057662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (rc < 0) { 3058662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s: Failed to set the frame number in the parameters", __func__); 3059662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 3060662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 30610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 306234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy /* Update stream id mask where buffers are requested */ 306334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK, 306434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy sizeof(streamTypeMask), &streamTypeMask); 306534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy if (rc < 0) { 306634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy ALOGE("%s: Failed to set stream type mask in the parameters", __func__); 306734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy return BAD_VALUE; 306834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy } 306934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy 307062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if(request->settings != NULL){ 307162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = translateMetadataToParameters(request); 307280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 307380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 3074662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 307580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 307680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 307780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 307880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 307980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 308080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 308180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 308280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 308380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 308480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 308562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * @request : request sent from framework 308680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 308780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 308880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 308980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 309080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 309180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 309262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang (const camera3_capture_request_t *request) 309380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 3094662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 309597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata frame_settings; 309662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang frame_settings = request->settings; 30970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30980b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang /* Do not change the order of the following list unless you know what you are 30990b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * doing. 31000b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * The order is laid out in such a way that parameters in the front of the table 31010b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * may be used to override the parameters later in the table. Examples are: 31020b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * 1. META_MODE should precede AEC/AWB/AF MODE 31030b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * 2. AEC MODE should preced EXPOSURE_TIME/SENSITIVITY/FRAME_DURATION 31040b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * 3. AWB_MODE should precede COLOR_CORRECTION_MODE 31050b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang * 4. Any mode should precede it's corresponding settings 31060b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang */ 31070b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_MODE)) { 31080b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0]; 31090b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE, 31100b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(metaMode), &metaMode); 31110b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) { 31120b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0]; 31130b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP, 31140b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 31150b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang fwk_sceneMode); 31160b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 31170b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(sceneMode), &sceneMode); 31180b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } else if (metaMode == ANDROID_CONTROL_MODE_OFF) { 31190b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 31200b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 31210b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(sceneMode), &sceneMode); 31220b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) { 31230b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 31240b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 31250b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(sceneMode), &sceneMode); 31260b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 31270b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 31280b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 31290b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 31300b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t fwk_aeMode = 31310b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 31320b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t aeMode; 31330b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang int32_t redeye; 31340b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 31350b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) { 31360b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang aeMode = CAM_AE_MODE_OFF; 31370b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } else { 31380b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang aeMode = CAM_AE_MODE_ON; 31390b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 31400b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 31410b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang redeye = 1; 31420b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } else { 31430b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang redeye = 0; 31440b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 31450b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 31460b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP, 31470b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(AE_FLASH_MODE_MAP), 31480b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang fwk_aeMode); 31490b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE, 31500b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(aeMode), &aeMode); 31510b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 31520b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(flashMode), &flashMode); 31530b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION, 31540b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(redeye), &redeye); 31550b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 31560b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 31570b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) { 31580b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t fwk_whiteLevel = 31590b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0]; 31600b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP, 31610b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP), 31620b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang fwk_whiteLevel); 31630b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE, 31640b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(whiteLevel), &whiteLevel); 31650b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 31660b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 31670b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang float focalDistance = -1.0; 31680b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) { 31690b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0]; 31700b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 31710b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang CAM_INTF_META_LENS_FOCUS_DISTANCE, 31720b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(focalDistance), &focalDistance); 31730b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 31740b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 31750b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) { 31760b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t fwk_focusMode = 31770b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0]; 31780b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang uint8_t focusMode; 31790b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) { 31800b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang focusMode = CAM_FOCUS_MODE_INFINITY; 31810b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } else{ 31820b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang focusMode = lookupHalName(FOCUS_MODES_MAP, 31830b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(FOCUS_MODES_MAP), 31840b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang fwk_focusMode); 31850b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 31860b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE, 31870b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang sizeof(focusMode), &focusMode); 31880b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang } 31890b11b27dc2c62f8fa8523ef8706d1cc61b3ea01eShuzhen Wang 31900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) { 31910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t antibandingMode = 31920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0]; 31930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING, 31940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(antibandingMode), &antibandingMode); 31950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 319697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 319753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 3198e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t expCompensation = frame_settings.find( 3199e936796df0426c326d043c2359c149024526f4bcShuzhen Wang ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 3200fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min) 3201fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_compensation_min; 3202fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max) 3203fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_compensation_max; 320453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION, 320553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab sizeof(expCompensation), &expCompensation); 320653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 320753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab 32080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) { 32090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0]; 32100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK, 32110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeLock), &aeLock); 32120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) { 32140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_fps_range_t fps_range; 32150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.min_fps = 32160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 32170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.max_fps = 32189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1]; 32190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE, 32200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(fps_range), &fps_range); 32210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 322297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 32230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) { 32240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t awbLock = 32250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0]; 32260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK, 32270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(awbLock), &awbLock); 32280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) { 32310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_effectMode = 32320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0]; 32330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP, 32340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(EFFECT_MODES_MAP), 32350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_effectMode); 32360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT, 32370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(effectMode), &effectMode); 32380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) { 32410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t colorCorrectMode = 32420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0]; 32430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = 32440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE, 32450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(colorCorrectMode), &colorCorrectMode); 32460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3247d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3248d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) { 3249d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_gains_t colorCorrectGains; 3250d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int i = 0; i < 4; i++) { 3251d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy colorCorrectGains.gains[i] = 3252d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i]; 3253d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3254d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = 3255d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_GAINS, 3256d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(colorCorrectGains), &colorCorrectGains); 3257d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3258d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3259d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) { 3260d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_matrix_t colorCorrectTransform; 3261d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_rational_type_t transform_elem; 3262d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy int num = 0; 3263d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int i = 0; i < 3; i++) { 3264d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 3; j++) { 3265d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy transform_elem.numerator = 3266d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator; 3267d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy transform_elem.denominator = 3268d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator; 3269d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy colorCorrectTransform.transform_matrix[i][j] = transform_elem; 3270d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy num++; 3271d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3272d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3273d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = 3274d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_TRANSFORM, 3275d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(colorCorrectTransform), &colorCorrectTransform); 3276d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3277d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3278e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang cam_trigger_t aecTrigger; 3279e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE; 3280e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger_id = -1; 32812dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&& 32822dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) { 32832dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger = 32840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0]; 32852dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger_id = 32862dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0]; 32870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, 32891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(aecTrigger), &aecTrigger); 32900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32912dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*af_trigger must come with a trigger id*/ 32922dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) && 32932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) { 32942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang cam_trigger_t af_trigger; 32952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger = 32960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0]; 32972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger_id = 32982dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0]; 32990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 33002dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger); 33010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) { 33040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t demosaic = 33050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0]; 33060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC, 33070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(demosaic), &demosaic); 33080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_MODE)) { 3311f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang cam_edge_application_t edge_application; 3312f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang edge_application.edge_mode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 3313f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang if (edge_application.edge_mode == CAM_EDGE_MODE_OFF) { 3314f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang edge_application.sharpness = 0; 3315f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang } else { 33164e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) { 33174e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang int32_t edgeStrength = 33184e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0]; 33194e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang edge_application.sharpness = edgeStrength; 33204e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang } else { 33214e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang edge_application.sharpness = gCamCapability[mCameraId]->sharpness_ctrl.def_value; //default 33224e9f714df832a61716a2aa6e0a213333abef1a8cShuzhen Wang } 3323f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang } 3324d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE_MODE, 3325f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang sizeof(edge_application), &edge_application); 33260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 3328e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (frame_settings.exists(ANDROID_FLASH_MODE)) { 33296356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani int32_t respectFlashMode = 1; 33306356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 33316356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t fwk_aeMode = 33326356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 33336356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) { 33346356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani respectFlashMode = 0; 33356356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: AE Mode controls flash, ignore android.flash.mode", 33366356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani __func__); 33376356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 33386356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 33396356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (respectFlashMode) { 33406356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t flashMode = 33416356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_FLASH_MODE).data.u8[0]; 33426356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP, 33436356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(FLASH_MODES_MAP), 33446356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode); 33456356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: flash mode after mapping %d", __func__, flashMode); 33466356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani // To check: CAM_INTF_META_FLASH_MODE usage 33476356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 33486356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(flashMode), &flashMode); 33496356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 3350e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 3351e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 33520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) { 33530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t flashPower = 33540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0]; 33550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER, 33560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(flashPower), &flashPower); 33570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) { 33600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t flashFiringTime = 33610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0]; 33620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 33630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime); 33640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) { 33670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t geometricMode = 33680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0]; 33690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE, 33700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricMode), &geometricMode); 33710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) { 33748867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t geometricStrength = 33750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0]; 33760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 33770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_GEOMETRIC_STRENGTH, 33780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricStrength), &geometricStrength); 33790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) { 33820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t hotPixelMode = 33830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0]; 33840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE, 33850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(hotPixelMode), &hotPixelMode); 33860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_APERTURE)) { 33890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float lensAperture = 33900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find( ANDROID_LENS_APERTURE).data.f[0]; 33910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE, 33920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(lensAperture), &lensAperture); 33930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) { 33960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float filterDensity = 33970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0]; 33980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY, 33990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(filterDensity), &filterDensity); 34000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 34020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 34030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float focalLength = 34040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 34050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 34060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_FOCAL_LENGTH, 34070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focalLength), &focalLength); 34080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 34100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) { 34110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t optStabMode = 34120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0]; 34138867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 34140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_OPT_STAB_MODE, 34150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(optStabMode), &optStabMode); 34160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 34180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) { 34190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedMode = 34200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]; 34218867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 34220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_MODE, 34230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedMode), &noiseRedMode); 34240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 34260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) { 34270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedStrength = 34280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0]; 34298867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 34300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_STRENGTH, 34310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedStrength), &noiseRedStrength); 34320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 343471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang cam_crop_region_t scalerCropRegion; 343571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool scalerCropSet = false; 34360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) { 34370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.left = 34380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0]; 34390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.top = 34400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1]; 34410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.width = 34420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2]; 344347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang scalerCropRegion.height = 344447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3]; 34450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 34460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SCALER_CROP_REGION, 34470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(scalerCropRegion), &scalerCropRegion); 344871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropSet = true; 34490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 34510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { 34520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorExpTime = 34530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0]; 345462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: setting sensorExpTime %lld", __func__, sensorExpTime); 34550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 34560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_EXPOSURE_TIME, 34570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorExpTime), &sensorExpTime); 34580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 34600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) { 34610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorFrameDuration = 34620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0]; 346362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int64_t minFrameDuration = getMinFrameDuration(request); 346462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang sensorFrameDuration = MAX(sensorFrameDuration, minFrameDuration); 3465e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration) 3466e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration; 346762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: clamp sensorFrameDuration to %lld", __func__, sensorFrameDuration); 34680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 34690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_FRAME_DURATION, 34700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorFrameDuration), &sensorFrameDuration); 34710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 34730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 34740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t sensorSensitivity = 34750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 3476e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity < 3477e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity) 3478e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 3479e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity; 3480e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity > 3481e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity) 3482e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 3483e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity; 348462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: clamp sensorSensitivity to %d", __func__, sensorSensitivity); 34850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 34860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_SENSITIVITY, 34870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorSensitivity), &sensorSensitivity); 34880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 34900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_MODE)) { 34910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t shadingMode = 34920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_MODE).data.u8[0]; 34930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE, 34940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingMode), &shadingMode); 34950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 34970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) { 34980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t shadingStrength = 34990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0]; 35000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH, 35010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingStrength), &shadingStrength); 35020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) { 35056990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t fwk_facedetectMode = 35060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0]; 35076990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t facedetectMode = 35086990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang lookupHalName(FACEDETECT_MODES_MAP, 35096990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode); 35100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 35110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_FACEDETECT_MODE, 35120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(facedetectMode), &facedetectMode); 35130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) { 35160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t histogramMode = 35170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0]; 35180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 35190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_HISTOGRAM_MODE, 35200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(histogramMode), &histogramMode); 35210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) { 35240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t sharpnessMapMode = 35250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0]; 35260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 35270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, 35280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sharpnessMapMode), &sharpnessMapMode); 35290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_TONEMAP_MODE)) { 35320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t tonemapMode = 35330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0]; 35340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 35350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_TONEMAP_MODE, 35360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(tonemapMode), &tonemapMode); 35370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3538e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* Tonemap curve channels ch0 = G, ch 1 = B, ch 2 = R */ 3539e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /*All tonemap channels will have the same number of points*/ 3540e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN) && 3541e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE) && 3542e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) { 3543e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_rgb_tonemap_curves tonemapCurves; 3544e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.tonemap_points_cnt = frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).count/2; 3545e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3546e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch0 = G*/ 3547e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang int point = 0; 3548e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_tonemap_curve_t tonemapCurveGreen; 3549e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt ; i++) { 3550d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3551e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurveGreen.tonemap_points[i][j] = 3552e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point]; 3553d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3554d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3555d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3556e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[0] = tonemapCurveGreen; 3557e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3558e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch 1 = B */ 3559e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang point = 0; 3560e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_tonemap_curve_t tonemapCurveBlue; 3561e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 3562d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3563e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurveBlue.tonemap_points[i][j] = 3564e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point]; 3565d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3566d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3567d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3568e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[1] = tonemapCurveBlue; 3569e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3570e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch 2 = R */ 3571e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang point = 0; 3572d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_tonemap_curve_t tonemapCurveRed; 3573e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 3574d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3575d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy tonemapCurveRed.tonemap_points[i][j] = 3576d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point]; 3577d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3578d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3579d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3580e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[2] = tonemapCurveRed; 3581e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3582d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, 3583e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang CAM_INTF_META_TONEMAP_CURVES, 3584e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang sizeof(tonemapCurves), &tonemapCurves); 3585d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 35860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 35880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t captureIntent = 35890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 35900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 35910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(captureIntent), &captureIntent); 35920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3594d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) { 3595d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t blackLevelLock = 3596d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0]; 3597d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_BLACK_LEVEL_LOCK, 3598d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(blackLevelLock), &blackLevelLock); 3599d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3600d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3601d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) { 3602d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t lensShadingMapMode = 3603d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0]; 3604d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE, 3605d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(lensShadingMapMode), &lensShadingMapMode); 3606d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3607d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 360859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) { 360959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 361071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 361162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AE_REGIONS); 361271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 361371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 361471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 361571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 361671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI, 361771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 361871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 361959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 362059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 362159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) { 362259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 362371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 362462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AF_REGIONS); 362571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 362671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 362771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 362871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 362971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI, 363071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 363171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 363259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 363359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 363459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) { 363559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 363671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 363762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AWB_REGIONS); 363871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 363971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 364071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 364171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 364271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS, 364371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 364471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 364559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 3646662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 3647662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 3648662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3649662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 36500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : getJpegSettings 3651662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 36520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL 3653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3654662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3655662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 3656662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @settings : frame settings information from framework 3657662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3658662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3659662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : success: NO_ERROR 3660662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * failure: 3661662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 3662662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings 3663662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (const camera_metadata_t *settings) 3664662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 3665662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (mJpegSettings) { 36669a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_timestamp) { 36679a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_timestamp); 36689a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 36699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 36709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_coordinates) { 36719a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 36729a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_coordinates[i]); 36739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 36749a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 36759a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 3676662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole free(mJpegSettings); 3677662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = NULL; 3678662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 3679662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t)); 368097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata jpeg_settings; 3681662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings = settings; 3682662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 36830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) { 36840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 36850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0]; 36860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 36870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 0; 36880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) { 36900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_quality = 36910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0]; 36920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 36931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mJpegSettings->jpeg_quality = 85; 36940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 36950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) { 36960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.width = 36970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0]; 36980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.height = 36990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1]; 37000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 370108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.width = 0; 370208ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.height = 0; 37030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) { 37050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < 3; i++) { 37069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*)); 37079a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_coordinates[i]) = 37080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i]; 37090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else{ 37119a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 37129a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 37133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 37140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37159a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 37160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { 37179a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*)); 37189a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_timestamp) = 37190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0]; 37209a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 37219a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 37220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 37240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { 37259a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count; 37269a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < len; i++) { 37279a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[i] = 37289a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i]; 37299a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 37309a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_processing_method[len-1] != '\0') { 37319a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[len] = '\0'; 37329a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 37339a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 37349a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[0] = '\0'; 37350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37363fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 37370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 37380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->sensor_sensitivity = 37390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 37403fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else { 37413fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed; 37420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 37439a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 37440b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi mJpegSettings->sensor_exposure_time = mMetadataResponse.exposure_time; 37450b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi 37460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 37470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->lens_focal_length = 37480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 37490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 375053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 375153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_compensation = 375253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 375353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 3754f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang mJpegSettings->sharpness = 10; //default value 3755f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang if (jpeg_settings.exists(ANDROID_EDGE_MODE)) { 3756f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang uint8_t edgeMode = jpeg_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 3757f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang if (edgeMode == ANDROID_EDGE_MODE_OFF) { 3758f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang mJpegSettings->sharpness = 0; 3759f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang } 3760f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang } 376153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step; 37620a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab mJpegSettings->max_jpeg_size = calcMaxJpegSize(); 37637ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->is_jpeg_format = true; 37647ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask; 376580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 376680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 376780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 376880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 3769e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 3770625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3771625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 3772625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3773625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3774625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 3775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 3776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 3777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 3779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 37801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata, 3781e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, 3782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frame_number, void *userdata) 3783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 3785625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 3786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 3787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3788625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3789625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->captureResultCb(metadata, buffer, frame_number); 3791625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 37947ee407aa1024789089aad411c372c79423699976Ajay Dudani 3795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 3797625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 3799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3801625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3802625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3803625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 3804625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 3805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 3808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 3809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3810d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3811625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3812625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3813625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3814625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3816625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3817625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 38181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->initialize(callback_ops); 3819d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 38201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 3825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 3832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 3833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 3834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 3837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 3839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3840d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 38471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->configureStreams(stream_list); 3848d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 38491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 3854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 3856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 3862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 3864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3865d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 38721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->registerStreamBuffers(buffer_set); 3873d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 38741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 3879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 3881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 3886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 3887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 38889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 38899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 38909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 3891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3893d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 3895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 3900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 390297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole fwk_metadata = hw->translateCapabilityToMetadata(type); 3903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3904d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 3906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 3910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3915625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3916625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 39189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 39199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 39209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 3921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3922d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 392380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 392480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 392580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 392680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 39279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 392880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 39299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 39301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->processCaptureRequest(request); 3931d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 39321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3933625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 3937625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3938625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3939625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3940625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3941625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3942625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3943625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3944625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3945625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3946e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops( 3947e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, 3948e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang vendor_tag_query_ops_t* ops) 3949625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3950d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3951e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3952e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3953e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3954e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3955e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3956e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3957e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3958e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->getMetadataVendorTagOps(ops); 3959d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3960e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 3965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3966625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3971625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump( 3975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, int fd) 3976625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3977d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3980e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3981e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3982e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->dump(fd); 3986d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3987e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3988625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3990e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 3991c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION : flush 3992c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3993c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION: 3994c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3995c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS : 3996c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3997c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3998c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN : 3999c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/ 4000c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 4001c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush( 4002c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang const struct camera3_device *device) 4003c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{ 4004c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang int rc; 4005c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGV("%s: E", __func__); 4006c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang QCamera3HardwareInterface *hw = 4007c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 4008c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang if (!hw) { 4009c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGE("%s: NULL camera device", __func__); 4010c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return -EINVAL; 4011c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang } 4012c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 4013c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang rc = hw->flush(); 4014c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGV("%s: X", __func__); 4015c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return rc; 4016c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang} 4017c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 4018c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*=========================================================================== 4019e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : close_camera_device 4020e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 4021e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 4022e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 4023e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 4024e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 4025e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 4026e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 4027e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 4028e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 4029e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 4030d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 4031e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int ret = NO_ERROR; 4032e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 4033e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>( 4034e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<camera3_device_t *>(device)->priv); 4035e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 4036e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("NULL camera device"); 4037e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return BAD_VALUE; 4038e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 4039e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete hw; 4040cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 4041cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 4042cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 0; 4043cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 4044d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 4045e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return ret; 4046e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 4047e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 40487ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 40497ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : getWaveletDenoiseProcessPlate 40507ee407aa1024789089aad411c372c79423699976Ajay Dudani * 40517ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate 40527ee407aa1024789089aad411c372c79423699976Ajay Dudani * 40537ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None 40547ee407aa1024789089aad411c372c79423699976Ajay Dudani * 40557ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : WNR prcocess plate vlaue 40567ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 40577ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate() 40587ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 40597ee407aa1024789089aad411c372c79423699976Ajay Dudani char prop[PROPERTY_VALUE_MAX]; 40607ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(prop, 0, sizeof(prop)); 40617ee407aa1024789089aad411c372c79423699976Ajay Dudani property_get("persist.denoise.process.plates", prop, "0"); 40627ee407aa1024789089aad411c372c79423699976Ajay Dudani int processPlate = atoi(prop); 40637ee407aa1024789089aad411c372c79423699976Ajay Dudani switch(processPlate) { 40647ee407aa1024789089aad411c372c79423699976Ajay Dudani case 0: 40657ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_YCBCR_PLANE; 40667ee407aa1024789089aad411c372c79423699976Ajay Dudani case 1: 40677ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_CBCR_ONLY; 40687ee407aa1024789089aad411c372c79423699976Ajay Dudani case 2: 40697ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 40707ee407aa1024789089aad411c372c79423699976Ajay Dudani case 3: 40717ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINED_CBCR; 40727ee407aa1024789089aad411c372c79423699976Ajay Dudani default: 40737ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 40747ee407aa1024789089aad411c372c79423699976Ajay Dudani } 40757ee407aa1024789089aad411c372c79423699976Ajay Dudani} 40767ee407aa1024789089aad411c372c79423699976Ajay Dudani 40777ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 40787ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : needRotationReprocess 40797ee407aa1024789089aad411c372c79423699976Ajay Dudani * 40807ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp 40817ee407aa1024789089aad411c372c79423699976Ajay Dudani * 40827ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 40837ee407aa1024789089aad411c372c79423699976Ajay Dudani * 40847ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : true: needed 40857ee407aa1024789089aad411c372c79423699976Ajay Dudani * false: no need 40867ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 40877ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess() 40887ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 40897ee407aa1024789089aad411c372c79423699976Ajay Dudani 40907ee407aa1024789089aad411c372c79423699976Ajay Dudani if (!mJpegSettings->is_jpeg_format) { 40917ee407aa1024789089aad411c372c79423699976Ajay Dudani // RAW image, no need to reprocess 40927ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 40937ee407aa1024789089aad411c372c79423699976Ajay Dudani } 40947ee407aa1024789089aad411c372c79423699976Ajay Dudani 40957ee407aa1024789089aad411c372c79423699976Ajay Dudani if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 && 40967ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->jpeg_orientation > 0) { 40977ee407aa1024789089aad411c372c79423699976Ajay Dudani // current rotation is not zero, and pp has the capability to process rotation 40987ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGD("%s: need do reprocess for rotation", __func__); 40997ee407aa1024789089aad411c372c79423699976Ajay Dudani return true; 41007ee407aa1024789089aad411c372c79423699976Ajay Dudani } 41017ee407aa1024789089aad411c372c79423699976Ajay Dudani 41027ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 41037ee407aa1024789089aad411c372c79423699976Ajay Dudani} 41047ee407aa1024789089aad411c372c79423699976Ajay Dudani 41057ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 4106c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * FUNCTION : needReprocess 4107c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 4108c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * DESCRIPTION: if reprocess in needed 4109c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 4110c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * PARAMETERS : none 4111c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 4112c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * RETURN : true: needed 4113c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * false: no need 4114c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *==========================================================================*/ 4115c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajanbool QCamera3HardwareInterface::needReprocess() 4116c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan{ 4117c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if (!mJpegSettings->is_jpeg_format) { 4118c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // RAW image, no need to reprocess 4119c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return false; 4120c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 4121c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 4122c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if ((mJpegSettings->min_required_pp_mask > 0) || 4123c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan isWNREnabled()) { 4124c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // TODO: add for ZSL HDR later 4125c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // pp module has min requirement for zsl reprocess, or WNR in ZSL mode 4126c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__); 4127c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return true; 4128c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 4129c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return needRotationReprocess(); 4130c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan} 4131c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 4132c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan/*=========================================================================== 41337ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : addOnlineReprocChannel 41347ee407aa1024789089aad411c372c79423699976Ajay Dudani * 41357ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames 41367ee407aa1024789089aad411c372c79423699976Ajay Dudani * coming from input channel 41377ee407aa1024789089aad411c372c79423699976Ajay Dudani * 41387ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 41397ee407aa1024789089aad411c372c79423699976Ajay Dudani * @pInputChannel : ptr to input channel whose frames will be post-processed 41407ee407aa1024789089aad411c372c79423699976Ajay Dudani * 41417ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : Ptr to the newly created channel obj. NULL if failed. 41427ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 41437ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel( 4144d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle) 41457ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 41467ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t rc = NO_ERROR; 41477ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3ReprocessChannel *pChannel = NULL; 41487ee407aa1024789089aad411c372c79423699976Ajay Dudani if (pInputChannel == NULL) { 41497ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: input channel obj is NULL", __func__); 41507ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 41517ee407aa1024789089aad411c372c79423699976Ajay Dudani } 41527ee407aa1024789089aad411c372c79423699976Ajay Dudani 41537ee407aa1024789089aad411c372c79423699976Ajay Dudani pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle, 41547ee407aa1024789089aad411c372c79423699976Ajay Dudani mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle); 41557ee407aa1024789089aad411c372c79423699976Ajay Dudani if (NULL == pChannel) { 41567ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: no mem for reprocess channel", __func__); 41577ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 41587ee407aa1024789089aad411c372c79423699976Ajay Dudani } 41597ee407aa1024789089aad411c372c79423699976Ajay Dudani 41607ee407aa1024789089aad411c372c79423699976Ajay Dudani // Capture channel, only need snapshot and postview streams start together 41617ee407aa1024789089aad411c372c79423699976Ajay Dudani mm_camera_channel_attr_t attr; 41627ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 41637ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 41647ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue(); 41657ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->initialize(); 41667ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 41677ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc); 41687ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 41697ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 41707ee407aa1024789089aad411c372c79423699976Ajay Dudani } 41717ee407aa1024789089aad411c372c79423699976Ajay Dudani 41727ee407aa1024789089aad411c372c79423699976Ajay Dudani // pp feature config 41737ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_pp_feature_config_t pp_config; 41747ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&pp_config, 0, sizeof(cam_pp_feature_config_t)); 41757ee407aa1024789089aad411c372c79423699976Ajay Dudani if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) { 41767ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS; 4177f7dca66435f16b52df005bd2fbb4fc0992c24c7dShuzhen Wang pp_config.sharpness = mJpegSettings->sharpness; 41787ee407aa1024789089aad411c372c79423699976Ajay Dudani } 41797ee407aa1024789089aad411c372c79423699976Ajay Dudani 41807ee407aa1024789089aad411c372c79423699976Ajay Dudani if (isWNREnabled()) { 41817ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D; 41827ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.denoise_enable = 1; 41837ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate(); 41847ee407aa1024789089aad411c372c79423699976Ajay Dudani } 41857ee407aa1024789089aad411c372c79423699976Ajay Dudani if (needRotationReprocess()) { 41867ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION; 41877ee407aa1024789089aad411c372c79423699976Ajay Dudani int rotation = mJpegSettings->jpeg_orientation; 41887ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rotation == 0) { 41897ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_0; 41907ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 90) { 41917ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_90; 41927ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 180) { 41937ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_180; 41947ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 270) { 41957ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_270; 41967ee407aa1024789089aad411c372c79423699976Ajay Dudani } 41977ee407aa1024789089aad411c372c79423699976Ajay Dudani } 41987ee407aa1024789089aad411c372c79423699976Ajay Dudani 41997ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->addReprocStreamsFromSource(pp_config, 42007ee407aa1024789089aad411c372c79423699976Ajay Dudani pInputChannel, 42017ee407aa1024789089aad411c372c79423699976Ajay Dudani mMetadataChannel); 42027ee407aa1024789089aad411c372c79423699976Ajay Dudani 42037ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 42047ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 42057ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 42067ee407aa1024789089aad411c372c79423699976Ajay Dudani } 42077ee407aa1024789089aad411c372c79423699976Ajay Dudani return pChannel; 42087ee407aa1024789089aad411c372c79423699976Ajay Dudani} 42097ee407aa1024789089aad411c372c79423699976Ajay Dudani 42107ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue() 42117ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 42127ee407aa1024789089aad411c372c79423699976Ajay Dudani return gCamCapability[mCameraId]->min_num_pp_bufs; 42137ee407aa1024789089aad411c372c79423699976Ajay Dudani} 42147ee407aa1024789089aad411c372c79423699976Ajay Dudani 4215acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajanbool QCamera3HardwareInterface::isWNREnabled() { 4216acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan return gCamCapability[mCameraId]->isWnrSupported; 4217acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan} 4218acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan 4219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 4220