QCamera3HWI.cpp revision 14dfc272241ba78c85a327da2872e71b3208f8c5
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; 239dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (channel) 240dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang delete channel; 2411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free (*it); 2421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 2431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 2447ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel = NULL; 2457ee407aa1024789089aad411c372c79423699976Ajay Dudani 24697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (mJpegSettings != NULL) { 24797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole free(mJpegSettings); 24897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mJpegSettings = NULL; 24997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 250dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 251dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang /* Clean up all channels */ 252dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (mCameraInitialized) { 253020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava mMetadataChannel->stop(); 254020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava delete mMetadataChannel; 255020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava mMetadataChannel = NULL; 256dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang deinitParameters(); 257dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang } 258dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 259cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraOpened) 260cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang closeCamera(); 261e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 26233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 26333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (mDefaultMetadata[i]) 26433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang free_camera_metadata(mDefaultMetadata[i]); 26533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 266e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_cond_destroy(&mRequestCond); 267e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 268e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mMutex); 269d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 287cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 288cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraSessionActive) { 289cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang ALOGE("%s: multiple simultaneous camera instance not supported", __func__); 290cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 291cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang return INVALID_OPERATION; 292cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } 293cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 300cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (rc == 0) { 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 302cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 1; 303cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } else 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 305cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 30699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 30799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == 0) { 30899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 30999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 31099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 31199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=1"); 31299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 31399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 31499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 31599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 316cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 36799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 36899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == NO_ERROR) { 36999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 37099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 37199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 37299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=0"); 37399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 37499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 37599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 37699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 37799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan 378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 397e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 398e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 39933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang rc = initParameters(); 40033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (rc < 0) { 40133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang ALOGE("%s: initParamters failed %d", __func__, rc); 40233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang goto err1; 40333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } 404020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava //Create metadata channel and initialize it 405020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 406020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava mCameraHandle->ops, captureResultCb, 407020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava &gCamCapability[mCameraId]->padding_info, this); 408020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava if (mMetadataChannel == NULL) { 409020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava ALOGE("%s: failed to allocate metadata channel", __func__); 410020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava rc = -ENOMEM; 411020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava goto err2; 412020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava } 413020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava rc = mMetadataChannel->initialize(); 414020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava if (rc < 0) { 415020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava ALOGE("%s: metadata channel initialization failed", __func__); 416020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava goto err3; 417020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava } 418020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava 4199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCallbackOps = callback_ops; 420e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 421e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 422cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraInitialized = true; 4239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 4249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 425020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastavaerr3: 426020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava delete mMetadataChannel; 427020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava mMetadataChannel = NULL; 428020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastavaerr2: 429020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava deinitParameters(); 4309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1: 431e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 4329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 45033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int rc = 0; 451d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mIsZslMode = false; 4520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_lock(&mMutex); 453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 456e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 462e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 469e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 470625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *inputStream = NULL; 474c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang camera3_stream_t *jpegStream = NULL; 4750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /* first invalidate all the steams in the mStreamList 4760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * if they appear again, they will be validated */ 4771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 479d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 480d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang channel->stop(); 4810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = INVALID; 4820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 483d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 486c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d", 487c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, newStream->stream_type, newStream->format, 488c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang newStream->width, newStream->height); 4890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //if the stream is in the mStreamList validate it 4900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole bool stream_exists = false; 4911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 4930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if ((*it)->stream == newStream) { 4941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = 4951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (QCamera3Channel*)(*it)->stream->priv; 4960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_exists = true; 4970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = RECONFIGURE; 4981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*delete the channel object associated with the stream because 4991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole we need to reconfigure*/ 5001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 5011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->stream->priv = NULL; 5020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (!stream_exists) { 5050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //new stream 5060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info_t* stream_info; 5070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info = (stream_info_t* )malloc(sizeof(stream_info_t)); 5080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->stream = newStream; 5090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->status = VALID; 5101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole stream_info->registered = 0; 5110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mStreamInfo.push_back(stream_info); 5120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 513c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT 514c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) { 515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 517e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 522c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->format == HAL_PIXEL_FORMAT_BLOB) { 523c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream = newStream; 524c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 5280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /*clean up invalid streams*/ 5291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 5301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end();) { 5310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if(((*it)->status) == INVALID){ 5321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 5331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 5340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole delete[] (buffer_handle_t*)(*it)->buffer_set.buffers; 5350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole free(*it); 5361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it = mStreamInfo.erase(it); 5371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 5381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it++; 5390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 542020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava //mMetadataChannel->stop(); 543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 550f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_INPUT: 551f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 552f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 553f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_BIDIRECTIONAL: 554f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 555f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab GRALLOC_USAGE_HW_CAMERA_WRITE; 556f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 557f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_OUTPUT: 558c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /* For video encoding stream, set read/write rarely 559c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * flag so that they may be set to un-cached */ 560c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) 561c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang newStream->usage = 562c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang (GRALLOC_USAGE_SW_READ_RARELY | 563c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang GRALLOC_USAGE_SW_WRITE_RARELY | 564c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang GRALLOC_USAGE_HW_CAMERA_WRITE); 565c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang else 566c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 567f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 568f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 569f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 570f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 5741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 577f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 5788867984d33ed870071109a4500402dddbc85c048Shuzhen Wang case HAL_PIXEL_FORMAT_YCbCr_420_888: 579f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 580c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 581c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream) { 582c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t width = jpegStream->width; 583c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t height = jpegStream->height; 5848bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode = true; 585c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 586c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mCameraHandle->ops, captureResultCb, 587c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this, newStream, 588c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang width, height); 589c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else 590c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 591f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 592f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 593f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 594f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 595f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 596f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 597f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 598f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 599f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 600f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 601f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_BLOB: 602f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 6037ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle, 604f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 605f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 6067ee407aa1024789089aad411c372c79423699976Ajay Dudani if (mPictureChannel == NULL) { 607f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 608f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 609f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 610f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 6117ee407aa1024789089aad411c372c79423699976Ajay Dudani newStream->priv = (QCamera3Channel*)mPictureChannel; 612f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 613f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 614f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab //TODO: Add support for app consumed format? 615f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 616f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 617f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 618625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 6258867984d33ed870071109a4500402dddbc85c048Shuzhen Wang /*For the streams to be reconfigured we need to register the buffers 6261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole since the framework wont*/ 6271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 6281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 6291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->status == RECONFIGURE) { 6301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 6311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*only register buffers for streams that have already been 6321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole registered*/ 6331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->registered) { 6341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = channel->registerBuffers((*it)->buffer_set.num_buffers, 6351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers); 6361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (rc != NO_ERROR) { 6371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Failed to register the buffers of old stream,\ 6381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = %d", __func__, rc); 6391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 640a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: channel %p has %d buffers", 641e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, channel, (*it)->buffer_set.num_buffers); 6420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream); 6461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (index == NAME_NOT_FOUND) { 6471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.add((*it)->stream, 0); 6481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 6491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueAt(index) = 0; 6501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 6510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Initialize mPendingRequestInfo and mPendnigBuffersMap */ 6541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.clear(); 6551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 656d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab /*flush the metadata list*/ 657d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!mStoredMetadataList.empty()) { 658d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 659d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 660d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 661d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 662d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 663d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 664d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 665d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab 66633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang //settings/parameters don't carry over for new configureStreams 6679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 66833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest = true; 66933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 67062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Get min frame duration for this streams configuration 67162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang deriveMinFrameDuration(); 67262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 673e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 67433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return rc; 675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : validateCaptureRequest 679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 680e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service 68180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 68280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 68380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 68480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 68580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 68680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 68780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 688e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest( 6899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 69080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 6919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 6929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 6949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 6969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 6979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 6989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 7039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 7049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 7059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 7069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 714c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang b = request->input_buffer; 715c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel *channel = 716c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 717c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (channel == NULL) { 718c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 719c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 720c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 721c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 722c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 723c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 724c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 725c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 726c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 727c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->release_fence != -1) { 728c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 729c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 730c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 731c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 732c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->buffer == NULL) { 733c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 734c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 735c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 736c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 7379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 7409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 7419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 7429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 7439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 7449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 7459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 7469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 7509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 7519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 7559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 7569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 7609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 7619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 7659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 7669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 7679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 768e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 769e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 770e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 771e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 77262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION : deriveMinFrameDuration 77362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 77462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: derive mininum processed, jpeg, and raw frame durations based 77562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * on currently configured streams. 77662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 77762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : NONE 77862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 77962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN : NONE 78062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 78162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/ 78262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangvoid QCamera3HardwareInterface::deriveMinFrameDuration() 78362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{ 78462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t maxJpegDimension, maxProcessedDimension; 78562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 78662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxJpegDimension = 0; 78762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = 0; 78862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 78962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang // Figure out maximum jpeg, processed, and raw dimensions 79062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (List<stream_info_t*>::iterator it = mStreamInfo.begin(); 79162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang it != mStreamInfo.end(); it++) { 79262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 79362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang // Input stream doesn't have valid stream_type 79462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if ((*it)->stream->stream_type == CAMERA3_STREAM_INPUT) 79562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang continue; 79662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 79762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t dimension = (*it)->stream->width * (*it)->stream->height; 79862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if ((*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) { 79962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (dimension > maxJpegDimension) 80062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxJpegDimension = dimension; 80162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } else if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_SENSOR) { 80262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (dimension > maxProcessedDimension) 80362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = dimension; 80462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 80562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 80662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 80762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Assume all jpeg dimensions are in processed dimensions. 80862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (maxJpegDimension > maxProcessedDimension) 80962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = maxJpegDimension; 81062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 81162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Find minimum durations for processed, jpeg, and raw 81262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinRawFrameDuration = gCamCapability[mCameraId]->raw_min_duration; 81362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 81462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (maxProcessedDimension == 81562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang gCamCapability[mCameraId]->picture_sizes_tbl[i].width * 81662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang gCamCapability[mCameraId]->picture_sizes_tbl[i].height) { 81762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinProcessedFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i]; 81862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinJpegFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i]; 81962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang break; 82062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 82162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 82262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang} 82362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 82462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*=========================================================================== 82562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION : getMinFrameDuration 82662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 82762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: get minimum frame draution based on the current maximum frame durations 82862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * and current request configuration. 82962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 83062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : @request: requset sent by the frameworks 83162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 83262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN : min farme duration for a particular request 83362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 83462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/ 83562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint64_t QCamera3HardwareInterface::getMinFrameDuration(const camera3_capture_request_t *request) 83662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{ 83762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang bool hasJpegStream = false; 83862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (uint32_t i = 0; i < request->num_output_buffers; i ++) { 83962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang const camera3_stream_t *stream = request->output_buffers[i].stream; 84062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (stream->format == HAL_PIXEL_FORMAT_BLOB) 84162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang hasJpegStream = true; 84262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 84362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 84462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (!hasJpegStream) 84562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return MAX(mMinRawFrameDuration, mMinProcessedFrameDuration); 84662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang else 84762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return MAX(MAX(mMinRawFrameDuration, mMinProcessedFrameDuration), mMinJpegFrameDuration); 84862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang} 84962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 85062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*=========================================================================== 851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : registerStreamBuffers 852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 853e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 854e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 855e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 856e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @stream_list : streams to be configured 857e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 858e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 859e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 860e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 861e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 862e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 863e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 864e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = 0; 865e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 866e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 867e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 868e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set == NULL) { 869e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 870e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->stream == NULL) { 874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 877e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 878e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->num_buffers < 1) { 879e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 880e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 881e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 882e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 883e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->buffers == NULL) { 884e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 885e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 886e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 887e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 889e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 890e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 891e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 8920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //set the buffer_set in the mStreamInfo array 8931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 8941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 8951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->stream == stream) { 8960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint32_t numBuffers = buffer_set->num_buffers; 8971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.stream = buffer_set->stream; 8981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.num_buffers = numBuffers; 8991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers]; 9001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->buffer_set.buffers == NULL) { 9010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Failed to allocate buffer_handle_t*", __func__); 9020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_unlock(&mMutex); 9030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole return -ENOMEM; 9040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (size_t j = 0; j < numBuffers; j++){ 9061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers[j] = buffer_set->buffers[j]; 9070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->registered = 1; 9090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 911e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 912e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 913e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 914e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 915e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENODEV; 916e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 917e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 918e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 919e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 920e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 921e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 922e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 923e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : processCaptureRequest 924e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 925e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service 926e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 927e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 928e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @request : request from framework to process 929e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 930e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 931e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 932e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 933e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 934e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_request_t *request) 935e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 936e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = NO_ERROR; 93774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id; 938e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata meta; 939d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo reproc_meta; 940d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int queueMetadata = 0; 941e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 943e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 9442123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang rc = validateCaptureRequest(request); 9452123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang if (rc != NO_ERROR) { 9462123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang ALOGE("%s: incoming request is not valid", __func__); 9472123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang pthread_mutex_unlock(&mMutex); 9482123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang return rc; 9492123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang } 9502123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9512123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang meta = request->settings; 9522123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9532123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang // For first capture request, send capture intent, and 9542123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang // stream on all streams 955d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang if (mFirstRequest) { 9562123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9572123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 9582123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang int32_t hal_version = CAM_HAL_V3; 9592123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang uint8_t captureIntent = 9602123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 9612123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9622123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 9632123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 9642123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 9652123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang sizeof(hal_version), &hal_version); 9662123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 9672123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang sizeof(captureIntent), &captureIntent); 9682123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, 9692123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mParameters); 9702123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang } 9712123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 972d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 973d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang it != mStreamInfo.end(); it++) { 974d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 975d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang channel->start(); 976d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang } 977d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang } 978d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang 979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frameNumber = request->frame_number; 98034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy uint32_t streamTypeMask = 0; 9819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 98274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab if (meta.exists(ANDROID_REQUEST_ID)) { 98374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0]; 98474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = request_id; 985013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Received request with id: %d",__func__, request_id); 98674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else if (mFirstRequest || mCurrentRequestId == -1){ 98774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab ALOGE("%s: Unable to find request id field, \ 98874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab & no previous id available", __func__); 98974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab return NAME_NOT_FOUND; 99074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else { 991013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Re-using old request id", __func__); 99274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = mCurrentRequestId; 99374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } 99474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 995d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d", 996c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, __LINE__, 997c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->num_output_buffers, 998c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer, 999c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang frameNumber); 1000e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // Acquire all request buffers first 10017ee407aa1024789089aad411c372c79423699976Ajay Dudani int blob_request = 0; 1002e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 1003e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 100434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 1005e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang sp<Fence> acquireFence = new Fence(output.acquire_fence); 100666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 100766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 100866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Call function to store local copy of jpeg data for encode params. 10097ee407aa1024789089aad411c372c79423699976Ajay Dudani blob_request = 1; 101066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = getJpegSettings(request->settings); 101166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (rc < 0) { 10120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: failed to get jpeg parameters", __func__); 101366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pthread_mutex_unlock(&mMutex); 101466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 101566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 101666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 101766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1018e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 1019e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != OK) { 1020e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: fence wait failed %d", __func__, rc); 1021e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1022e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 1023e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 102434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy streamTypeMask |= channel->getStreamTypeMask(); 102534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy } 102634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy 102762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = setFrameParameters(request, streamTypeMask); 102834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy if (rc < 0) { 102934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy ALOGE("%s: fail to set frame parameters", __func__); 103034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy pthread_mutex_unlock(&mMutex); 103134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy return rc; 1032e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1033e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 10341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Update pending request list and pending buffers map */ 10351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole PendingRequestInfo pendingRequest; 10361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.frame_number = frameNumber; 10371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.num_buffers = request->num_output_buffers; 103874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab pendingRequest.request_id = request_id; 10397ee407aa1024789089aad411c372c79423699976Ajay Dudani pendingRequest.blob_request = blob_request; 104013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab pendingRequest.input_buffer_present = (request->input_buffer != NULL)? 1 : 0; 104174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 10421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < request->num_output_buffers; i++) { 10431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole RequestedBufferInfo requestedBuf; 10441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.stream = request->output_buffers[i].stream; 10451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.buffer = NULL; 10461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.buffers.push_back(requestedBuf); 10471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(requestedBuf.stream)++; 10491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.push_back(pendingRequest); 10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 1053e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMetadataChannel->request(NULL, frameNumber); 10549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 10559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 10569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 10579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 10589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 1059c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mm_camera_buf_def_t *pInputBuffer = NULL; 106066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 10619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 10629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 10639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 10649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 10659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 106666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 1067c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3RegularChannel* inputChannel = NULL; 1068c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(request->input_buffer != NULL){ 1069c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang //Try to get the internal format 1070c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel = (QCamera3RegularChannel*) 1071c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->stream->priv; 1072c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(inputChannel == NULL ){ 1073c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: failed to get input channel handle", __func__); 1074c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else { 1075c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer = 1076c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel->getInternalFormatBuffer( 1077c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->buffer); 1078c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("%s: Input buffer dump",__func__); 1079c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("Stream id: %d", pInputBuffer->stream_id); 1080c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("streamtype:%d", pInputBuffer->stream_type); 1081c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("frame len:%d", pInputBuffer->frame_len); 108241da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab ALOGD("Handle:%p", request->input_buffer->buffer); 1083d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //TODO: need to get corresponding metadata and send it to pproc 1084d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1085d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 1086d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->zsl_buf_hdl == request->input_buffer->buffer) { 1087d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab reproc_meta.meta_buf = m->meta_buf; 1088d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab queueMetadata = 1; 1089d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1090d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1091d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1092c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1093c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1094c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang rc = channel->request(output.buffer, frameNumber, mJpegSettings, 1095c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer,(QCamera3Channel*)inputChannel); 1096d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (queueMetadata) { 109741da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(reproc_meta.meta_buf,mMetadataChannel,false); 1098d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 109966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 1100d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: %d, request with buffer %p, frame_number %d", __func__, 1101a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab __LINE__, output.buffer, frameNumber); 1102d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (mIsZslMode && output.stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1103d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1104d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 1105d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (uint32_t j = 0; j < request->num_output_buffers; j++) { 1106d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->zsl_buf_hdl == request->output_buffers[j].buffer) { 1107d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 1108d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 1109d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 1110d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1111d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1112d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1113d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1114d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 111566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = channel->request(output.buffer, frameNumber); 111666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 11179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 11189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 11199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 11209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 11211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mFirstRequest = false; 11221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 11239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 11249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 1; 11259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang while (mPendingRequest == 1) { 11265b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_cond_wait(&mRequestCond, &mMutex); 11279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 11289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1129e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 113080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 113180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 113280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 11339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 1134e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : getMetadataVendorTagOps 11359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 1136e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 11379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 11389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 1139e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1140e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1141e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1142e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1143b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps( 1144b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang vendor_tag_query_ops_t* /*ops*/) 1145e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1146e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Enable locks when we eventually add Vendor Tags */ 1147e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 1148e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1149e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1150e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1151e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 1152e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1153e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1154e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1155e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1156e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : dump 1157e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1158e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 1159e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1160e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1161e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1162e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1163e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1164e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1165b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/) 1166e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /*Enable lock when we implement this function*/ 1168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 1169e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1171e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1172e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 1173e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1174e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1175e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1176c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*=========================================================================== 1177c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION : flush 1178c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1179c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION: 1180c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1181c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS : 1182c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1183c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1184c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN : 1185c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/ 1186c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush() 1187c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{ 1188c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /*Enable lock when we implement this function*/ 1189c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /* 1190c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang pthread_mutex_lock(&mMutex); 1191c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 1192c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang pthread_mutex_unlock(&mMutex); 1193c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang */ 1194c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return 0; 1195c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang} 11967ee407aa1024789089aad411c372c79423699976Ajay Dudani 1197e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1198e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 1199e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 120033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result 120133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * (streams, as well as metadata) 1202e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1203e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1204e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @metadata : metadata information 120533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. 120633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * NULL if metadata. 12079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 12089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 12099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 12101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf, 1211e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 12129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 12135b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_lock(&mMutex); 1214e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 12151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (metadata_buf) { 12161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer; 121733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int32_t frame_number_valid = *(int32_t *) 121833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata); 1219152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang uint32_t pending_requests = *(uint32_t *)POINTER_OF( 1220152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang CAM_INTF_META_PENDING_REQUESTS, metadata); 122133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang uint32_t frame_number = *(uint32_t *) 122233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata); 12230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole const struct timeval *tv = (const struct timeval *) 12240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata); 12250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC + 12260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole tv->tv_usec * NSEC_PER_USEC; 12270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 12281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!frame_number_valid) { 1229a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: Not a valid frame number, used as SOF only", __func__); 12301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->bufDone(metadata_buf); 12311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole goto done_metadata; 12321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1233a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__, 1234e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang frame_number, capture_time); 12351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 12361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Go through the pending requests info and send shutter/results to frameworks 12371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1238e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i != mPendingRequestsList.end() && i->frame_number <= frame_number;) { 12391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 12401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_notify_msg_t notify_msg; 1241a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number); 12421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 12431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Flush out all entries with less or equal frame numbers. 12441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 1245e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: Make sure shutter timestamp really reflects shutter timestamp. 1246e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //Right now it's the same as metadata timestamp 1247e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 1248e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: When there is metadata drop, how do we derive the timestamp of 1249e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //dropped frames? For now, we fake the dropped timestamp by substracting 1250e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //from the reported timestamp 1251e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang nsecs_t current_capture_time = capture_time - 1252e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang (frame_number - i->frame_number) * NSEC_PER_33MSEC; 1253e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 12541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send shutter notify to frameworks 12551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.type = CAMERA3_MSG_SHUTTER; 12561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.message.shutter.frame_number = i->frame_number; 1257e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang notify_msg.message.shutter.timestamp = current_capture_time; 12581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1259a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__, 1260e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i->frame_number, capture_time); 12611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 12621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send empty metadata with already filled buffers for dropped metadata 12631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // and send valid metadata with already filled buffers for current metadata 12641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i->frame_number < frame_number) { 126599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang CameraMetadata dummyMetadata; 126699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP, 1267e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ¤t_capture_time, 1); 126899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_REQUEST_ID, 126974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab &(i->request_id), 1); 127099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang result.result = dummyMetadata.release(); 12711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 1272e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.result = translateCbMetadataToResultMetadata(metadata, 127374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab current_capture_time, i->request_id); 1274d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (mIsZslMode) { 1275d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int found_metadata = 0; 1276d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //for ZSL case store the metadata buffer and corresp. ZSL handle ptr 1277d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1278d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab j != i->buffers.end(); j++) { 1279d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (j->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1280d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //check if corresp. zsl already exists in the stored metadata list 1281d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1282d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.begin(); m++) { 1283d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->frame_number == frame_number) { 1284d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m->meta_buf = metadata_buf; 1285d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found_metadata = 1; 1286d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1287d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1288d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1289d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found_metadata) { 1290d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo store_meta_info; 1291d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab store_meta_info.meta_buf = metadata_buf; 1292d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab store_meta_info.frame_number = frame_number; 1293d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mStoredMetadataList.push_back(store_meta_info); 1294d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found_metadata = 1; 1295d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1296d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1297d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1298d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found_metadata) { 129913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab if (!i->input_buffer_present && i->blob_request) { 130013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab //livesnapshot or fallback non-zsl snapshot case 130113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 130213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab j != i->buffers.end(); j++){ 130313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab if (j->stream->stream_type == CAMERA3_STREAM_OUTPUT && 130413c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab j->stream->format == HAL_PIXEL_FORMAT_BLOB) { 130541da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true); 130613c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab break; 130713c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 130813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 130913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } else { 131013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab //return the metadata immediately 131113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab mMetadataChannel->bufDone(metadata_buf); 131213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab free(metadata_buf); 131313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 1314d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1315d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else if (!mIsZslMode && i->blob_request) { 13167ee407aa1024789089aad411c372c79423699976Ajay Dudani //If it is a blob request then send the metadata to the picture channel 131741da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true); 1318d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else { 13197ee407aa1024789089aad411c372c79423699976Ajay Dudani // Return metadata buffer 13207ee407aa1024789089aad411c372c79423699976Ajay Dudani mMetadataChannel->bufDone(metadata_buf); 13217ee407aa1024789089aad411c372c79423699976Ajay Dudani free(metadata_buf); 1322d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1323d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab 13241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result.result) { 13261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: metadata is NULL", __func__); 13271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.frame_number = i->frame_number; 13291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 0; 1330e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.output_buffers = NULL; 13311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1332e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 13331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 13341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers++; 13351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 13381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (result.num_output_buffers > 0) { 13391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_stream_buffer_t *result_buffers = 13401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole new camera3_stream_buffer_t[result.num_output_buffers]; 13411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result_buffers) { 13421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Fatal error: out of memory", __func__); 13431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole size_t result_buffers_idx = 0; 13451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1346e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 13471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 13481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result_buffers[result_buffers_idx++] = *(j->buffer); 13491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free(j->buffer); 135013dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang j->buffer = NULL; 13511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(j->stream)--; 13521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = result_buffers; 13551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 13561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1357a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: meta frame_number = %d, capture_time = %lld", 1358d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 13591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 13601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete[] result_buffers; 13611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 13621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1363d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: meta frame_number = %d, capture_time = %lld", 1364d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 13651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 13661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // erase the element from the list 13681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i = mPendingRequestsList.erase(i); 13691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 137033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 137133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 13721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata: 13731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole bool max_buffers_dequeued = false; 13741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < mPendingBuffersMap.size(); i++) { 13751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i); 1376e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang uint32_t queued_buffers = mPendingBuffersMap.valueAt(i); 13771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (queued_buffers == stream->max_buffers) { 13781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole max_buffers_dequeued = true; 13791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole break; 13801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1382152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang if (!max_buffers_dequeued && !pending_requests) { 13831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Unblock process_capture_request 13841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequest = 0; 13851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_cond_signal(&mRequestCond); 13861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 13881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // If the frame number doesn't exist in the pending request list, 13891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // directly send the buffer to the frameworks, and update pending buffers map 13901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Otherwise, book-keep the buffer. 13911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1392c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang while (i != mPendingRequestsList.end() && i->frame_number != frame_number){ 13931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i++; 1394c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 13951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i == mPendingRequestsList.end()) { 13961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Verify all pending requests frame_numbers are greater 13971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin(); 1398e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != mPendingRequestsList.end(); j++) { 13991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->frame_number < frame_number) { 14001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: pending frame number %d is smaller than %d", 14011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole __func__, j->frame_number, frame_number); 14021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 14051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.result = NULL; 140633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang result.frame_number = frame_number; 14071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 1; 14081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = buffer; 1409a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: result frame_number = %d, buffer = %p", 1410e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, frame_number, buffer); 14111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(buffer->stream)--; 1412d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (buffer->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1413d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int found = 0; 1414d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator k = mStoredMetadataList.begin(); 1415d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab k != mStoredMetadataList.end(); k++) { 1416d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (k->frame_number == frame_number) { 1417d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab k->zsl_buf_hdl = buffer->buffer; 1418d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found = 1; 1419d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1420d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1421d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1422d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found) { 1423d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo meta_info; 1424d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab meta_info.frame_number = frame_number; 1425d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab meta_info.zsl_buf_hdl = buffer->buffer; 1426d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mStoredMetadataList.push_back(meta_info); 1427d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1428d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1429e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 143033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } else { 14311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1432e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 14331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->stream == buffer->stream) { 14341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer != NULL) { 14351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: buffer is already set", __func__); 14361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 14371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole j->buffer = (camera3_stream_buffer_t *)malloc( 14381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(camera3_stream_buffer_t)); 14391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole *(j->buffer) = *buffer; 1440a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: cache buffer %p at result frame_number %d", 1441e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, buffer, frame_number); 14421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1445e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 14469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 14475b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_unlock(&mMutex); 14489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 14499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 14509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 145197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 145297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : translateCbMetadataToResultMetadata 145397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 145497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: 145597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 145697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 145797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @metadata : metadata information from callback 145897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 145997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN : camera_metadata_t* 146097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * metadata in a format specified by fwk 146197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 146297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* 146397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata 146474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab (metadata_buffer_t *metadata, nsecs_t timestamp, 146574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id) 146697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 146797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata camMetadata; 146897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camera_metadata_t* resultMetadata; 146997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 14700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); 147174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1); 147297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 147397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_HISTOGRAM - TODO*/ 147497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*cam_hist_stats_t *histogram = 147597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM, 147697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole metadata);*/ 147797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 147897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*face detection*/ 147997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *) 148097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata); 148197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t numFaces = faceDetectionInfo->num_faces_detected; 148297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceIds[numFaces]; 148397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t faceScores[numFaces]; 148497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceRectangles[numFaces * 4]; 148597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceLandmarks[numFaces * 6]; 148697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int j = 0, k = 0; 148797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < numFaces; i++) { 148897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceIds[i] = faceDetectionInfo->faces[i].face_id; 148997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceScores[i] = faceDetectionInfo->faces[i].score; 149059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(faceDetectionInfo->faces[i].face_boundary, 149197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles+j, -1); 149297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k); 149397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole j+= 4; 149497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole k+= 6; 149597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 149699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang if (numFaces > 0) { 149799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces); 149899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces); 149999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES, 150097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles, numFaces*4); 150199b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS, 150297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceLandmarks, numFaces*6); 150399b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang } 150497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15058867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t *color_correct_mode = 15060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata); 150797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1); 150897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 150997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *ae_precapture_id = 151097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata); 151197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1); 151297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 151397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*aec regions*/ 151497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAeRegions = 151597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata); 151697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t aeRegions[5]; 151759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight); 151897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5); 151913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab 152013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab uint8_t *ae_state = 15218bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata); 152213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1); 152313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab 15240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *focusMode = 15250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata); 152697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1); 152797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 152897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*af regions*/ 152997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAfRegions = 153097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata); 153197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t afRegions[5]; 153259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight); 153397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5); 153497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata); 153697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1); 153797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 153897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *afTriggerId = 153997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata); 154097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1); 154197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalance = 15430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata); 154497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1); 154597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 154697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*awb regions*/ 154797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAwbRegions = 154897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata); 154997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t awbRegions[5]; 155059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight); 155197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5); 155297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalanceState = 15540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata); 155597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1); 155697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata); 155897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_MODE, mode, 1); 155997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1560d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE_MODE, metadata); 156197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1); 156297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashPower = 15640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata); 156597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1); 156697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 156797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *flashFiringTime = 156897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata); 156997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1); 157097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 157197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *ledMode = 157297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata); 157397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/ 157497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashState = 15760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata); 157797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_STATE, flashState, 1); 157897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *hotPixelMode = 15800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata); 158197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1); 158297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 158397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *lensAperture = 158497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata); 158597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1); 158697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 158797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *filterDensity = 158897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata); 158997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1); 159097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 159197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focalLength = 159297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata); 159397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1); 159497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 159597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusDistance = 159697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata); 159797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1); 159897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 159997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusRange = 160097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata); 160197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1); 160297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *opticalStab = 16040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata); 16050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1); 160697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 160797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *focusState = 160897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata); 160997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */ 161097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *noiseRedMode = 16120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata); 161397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1); 161497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 161597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_SCALER_CROP_REGION - check size*/ 161697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_crop_region_t *hScalerCropRegion =(cam_crop_region_t *) 161897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata); 161971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t scalerCropRegion[4]; 16200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[0] = hScalerCropRegion->left; 16210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[1] = hScalerCropRegion->top; 16220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[2] = hScalerCropRegion->width; 162371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropRegion[3] = hScalerCropRegion->height; 162471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4); 162597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 162697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorExpTime = 162797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata); 16280b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi mMetadataResponse.exposure_time = *sensorExpTime; 162962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: sensorExpTime = %lld", __func__, *sensorExpTime); 163097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1); 163197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 163297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorFameDuration = 163397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata); 163462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: sensorFameDuration = %lld", __func__, *sensorFameDuration); 163597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1); 163697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 163797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *sensorSensitivity = 163897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata); 163962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: sensorSensitivity = %d", __func__, *sensorSensitivity); 16403fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mMetadataResponse.iso_speed = *sensorSensitivity; 164197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1); 164297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *shadingMode = 16440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata); 164597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1); 164697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *faceDetectMode = 16480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata); 16496990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t fwk_faceDetectMode = lookupFwkName(FACEDETECT_MODES_MAP, 16506990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]), 16516990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang *faceDetectMode); 16526990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1); 165397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *histogramMode = 16550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata); 165697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1); 165797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *sharpnessMapMode = 16590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata); 166097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 166197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole sharpnessMapMode, 1); 166297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 166397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/ 166497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_sharpness_map_t *sharpnessMap = (cam_sharpness_map_t *) 166597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata); 166697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP, 166797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t*)sharpnessMap->sharpness, 166897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT); 166997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1670d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *) 1671d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_LENS_SHADING_MAP, metadata); 1672d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height; 1673d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy int map_width = gCamCapability[mCameraId]->lens_shading_map_size.width; 1674d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP, 1675d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy (float*)lensShadingMap->lens_shading, 1676d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 4*map_width*map_height); 1677d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1678d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*) 1679d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata); 1680d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4); 1681d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1682d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*) 1683d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata); 1684d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM, 1685d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3); 1686d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1687d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*) 1688d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata); 1689d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS, 1690d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy predColorCorrectionGains->gains, 4); 1691d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1692d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*) 1693d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata); 1694d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM, 1695d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3); 1696d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1697d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t *blackLevelLock = (uint8_t*) 1698d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata); 1699d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1); 1700d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1701d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t *sceneFlicker = (uint8_t*) 1702d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_SCENE_FLICKER, metadata); 1703d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1); 1704d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1705d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 170697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole resultMetadata = camMetadata.release(); 170733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return resultMetadata; 170897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 170997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 171097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 171159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertToRegions 171297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 171397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array 171497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 171597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 171697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @rect : cam_rect_t struct to convert 171797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @region : int32_t destination array 171897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @weight : if we are converting from cam_area_t, weight is valid 171997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * else weight = -1 172097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 172197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 172259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){ 172397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[0] = rect.left; 172497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[1] = rect.top; 172559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[2] = rect.left + rect.width; 172659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[3] = rect.top + rect.height; 172797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (weight > -1) { 172897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[4] = weight; 172997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 173097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 173159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 173259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*=========================================================================== 173359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertFromRegions 173459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 173559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t 173659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 173759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS : 173859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @rect : cam_rect_t struct to convert 173959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @region : int32_t destination array 174059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @weight : if we are converting from cam_area_t, weight is valid 174159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * else weight = -1 174259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 174359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/ 174459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi, 174559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang const camera_metadata_t *settings, 174659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang uint32_t tag){ 174759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang CameraMetadata frame_settings; 174859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang frame_settings = settings; 174959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_min = frame_settings.find(tag).data.i32[0]; 175059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_min = frame_settings.find(tag).data.i32[1]; 175159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_max = frame_settings.find(tag).data.i32[2]; 175259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_max = frame_settings.find(tag).data.i32[3]; 175359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->weight = frame_settings.find(tag).data.i32[4]; 175459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.left = x_min; 175559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.top = y_min; 175659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.width = x_max - x_min; 175759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.height = y_max - y_min; 175859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang} 175959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 176097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 176171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION : resetIfNeededROI 176271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 176371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler 176471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * crop region 176571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 176671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS : 176771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @roi : cam_area_t struct to resize 176871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @scalerCropRegion : cam_crop_region_t region to compare against 176971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 177071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 177171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/ 177271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi, 177371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang const cam_crop_region_t* scalerCropRegion) 177471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{ 177571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_x_max = roi->rect.width + roi->rect.left; 177671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_y_max = roi->rect.height + roi->rect.top; 177771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top; 177871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left; 177971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if ((roi_x_max < scalerCropRegion->left) || 178071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi_y_max < scalerCropRegion->top) || 178171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.left > crop_x_max) || 178271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.top > crop_y_max)){ 178371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return false; 178471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 178571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.left < scalerCropRegion->left) { 178671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.left = scalerCropRegion->left; 178771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 178871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.top < scalerCropRegion->top) { 178971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.top = scalerCropRegion->top; 179071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 179171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_x_max > crop_x_max) { 179271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_x_max = crop_x_max; 179371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 179471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_y_max > crop_y_max) { 179571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_y_max = crop_y_max; 179671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 179771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.width = roi_x_max - roi->rect.left; 179871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.height = roi_y_max - roi->rect.top; 179971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return true; 180071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang} 180171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang 180271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*=========================================================================== 180397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : convertLandmarks 180497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 180597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info 180697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 180797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 180897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @face : cam_rect_t struct to convert 180997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @landmarks : int32_t destination array 181097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 181197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 181297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 181397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks) 181497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 181597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[0] = face.left_eye_center.x; 181697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[1] = face.left_eye_center.y; 181797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[2] = face.right_eye_center.y; 181897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[3] = face.right_eye_center.y; 181997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[4] = face.mouth_center.x; 182097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[5] = face.mouth_center.y; 182197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 182297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 1824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 1826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 1828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 1834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 1835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 1837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 1839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 1840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 1841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 1843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 1844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 1845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 1846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 1847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1849e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 1850e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (capabilityHeap == NULL) { 1851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: creation of capabilityHeap failed", __func__); 1852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang goto heap_creation_failed; 1853e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 1855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 1856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 1857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 1858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 1859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 1862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 1863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 1864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 1865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 1866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 1869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 1870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 1873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 1874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 1876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 1879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 1880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 1881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 1884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 1886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 1888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 1889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 1890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 1891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 1892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 1893e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete capabilityHeap; 1894e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed: 1895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 1896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 1897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 1898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1902662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : initParameters 1903662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1904662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters 1905662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1906662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1907662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1908662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1909662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 1910662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1911662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1912662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters() 1913662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1914662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 1915662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1916662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Allocate Set Param Buffer 1917662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = new QCamera3HeapMemory(); 1918662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 1919662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc != OK) { 1920662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = NO_MEMORY; 1921662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("Failed to allocate SETPARM Heap memory"); 1922662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1923662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1925662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1926662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Map memory for parameters buffer 1928662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 1929662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole CAM_MAPPING_BUF_TYPE_PARM_BUF, 1930662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->getFd(0), 1931662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(parm_buffer_t)); 1932662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc < 0) { 1933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:failed to map SETPARM buffer",__func__); 1934662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = FAILED_TRANSACTION; 1935662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->deallocate(); 1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1937662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0); 1942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1945662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 194633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION : deinitParameters 194733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 194833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters 194933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 195033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS : 195133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 195233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN : NONE 195333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/ 195433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters() 195533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{ 195633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 195733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF); 195833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 195933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap->deallocate(); 196033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang delete mParamHeap; 196133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap = NULL; 196233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 196333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters = NULL; 196433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang} 196533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 196633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*=========================================================================== 19670a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION : calcMaxJpegSize 19680a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 19690a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId 19700a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 19710a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS : 19720a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 19730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN : max_jpeg_size 19740a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/ 19750a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize() 19760a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{ 19770a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int32_t max_jpeg_size = 0; 19780a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int temp_width, temp_height; 19790a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 19800a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width; 19810a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height; 19820a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab if (temp_width * temp_height > max_jpeg_size ) { 19830a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = temp_width * temp_height; 19840a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 19850a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 19860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 19870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab return max_jpeg_size; 19880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab} 19890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab 19900a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*=========================================================================== 1991625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 1992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1993625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 1994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1997625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1998625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1999625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 2000625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 2001625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 2003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2004625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 200597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata staticInfo; 2006c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 2007c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang /* android.info: hardware level */ 2008c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL; 2009c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, 2010c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &supportedHardwareLevel, 1); 2011c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 2012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK; 2013662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 3 only*/ 20142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 20152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); */ 20162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2017e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang /*hard coded for now but this should come from sensor*/ 2018e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang float min_focus_distance; 2019e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if(facingBack){ 2020e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 10; 2021e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2022e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 0; 2023e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 20252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &min_focus_distance, 1); 2026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 2028625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 2029625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2030c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*should be using focal lengths but sensor doesn't provide that info now*/ 2031625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 2032c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &gCamCapability[cameraId]->focal_length, 2033c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1); 2034625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 2036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 2037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 2038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 2040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 2041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 2042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 2045c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)gCamCapability[cameraId]->optical_stab_modes, 2046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 2047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 204880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 204980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 205080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 205180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 205247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 205380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 205480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 205580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 205680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 2057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 205847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 20590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->geo_correction_map_size.height}; 206080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 206180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 206280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 206380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 206480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 206580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 2066c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float)); 206780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 206880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 206980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 207080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 207180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 207280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 207380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 207480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 207580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 207680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 207780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 207880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 2079c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1); 208080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 208147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 208280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 208380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 208480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 208580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 208622817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t active_array_size[] = {0, 0, 208722817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala gCamCapability[cameraId]->active_array_size.width, 208880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 208980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 209022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala active_array_size, 4); 209180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 209280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 209380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 2094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 209580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 209680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 209780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 209880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 209980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 210080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 210180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 210280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 210380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 210480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 21056990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang (int*)&gCamCapability[cameraId]->max_num_roi, 1); 210680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 210780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 210880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 210980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 211080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 211180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 211280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 211347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 211480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 211580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 211680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 211780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 211880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 211980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 212080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 212180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 212280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 212380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 212480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 212580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 212680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 212722817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888, 212822817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB}; 212922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t); 2130662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 2131662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats, 21328867984d33ed870071109a4500402dddbc85c048Shuzhen Wang scalar_formats_count); 2133662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 213447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_processed_sizes[CAM_FORMAT_MAX * 2]; 213500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang makeTable(gCamCapability[cameraId]->picture_sizes_tbl, 213600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt, 2137662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes); 2138662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2139662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes, 214000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2); 214100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 2142e936796df0426c326d043c2359c149024526f4bcShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, 214300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 214400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 21450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 214647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_fps_ranges[MAX_SIZES_CNT * 2]; 21470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl, 21480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->fps_ranges_tbl_cnt, 21490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole available_fps_ranges); 2150c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2151c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) ); 2152c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 215347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang camera_metadata_rational exposureCompensationStep = { 2154c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.numerator, 2155c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.denominator}; 2156c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 2157c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &exposureCompensationStep, 1); 2158c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2159c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*TO DO*/ 216047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF}; 2161c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 2162c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableVstabModes, sizeof(availableVstabModes)); 2163c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2164b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang /*HAL 1 and HAL 3 common*/ 21659443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab float maxZoom = 4; 2166c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 2167c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &maxZoom, 1); 2168c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 216947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max3aRegions = 1; 2170c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_MAX_REGIONS, 2171c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &max3aRegions, 1); 2172c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 217347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableFaceDetectModes[] = { 21746990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, 21756990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_FULL }; 2176c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 2177c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableFaceDetectModes, 2178c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(availableFaceDetectModes)); 2179c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 218047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width, 2181662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->raw_dim.height}; 2182662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 2183662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole raw_size, 2184662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(raw_size)/sizeof(uint32_t)); 2185662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 218647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 218780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 218880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 218980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 219080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 219180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 2192662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint8_t lensFacing = (facingBack) ? 219380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 219480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 2195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2196662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 219700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang available_processed_sizes, 2198c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2)); 2199c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2200c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 220108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab available_thumbnail_sizes, 220208ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab sizeof(available_thumbnail_sizes)/sizeof(int32_t)); 2203662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 220447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max_jpeg_size = 0; 220597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int temp_width, temp_height; 220697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 220797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width; 220897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height; 220997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (temp_width * temp_height > max_jpeg_size ) { 221097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = temp_width * temp_height; 221197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 221297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 221397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 221497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole staticInfo.update(ANDROID_JPEG_MAX_SIZE, 221597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole &max_jpeg_size, 1); 221697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 221747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_effects[CAM_EFFECT_MODE_MAX]; 22180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t size = 0; 2219662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) { 22200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(EFFECT_MODES_MAP, 2221b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]), 22220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_effects[i]); 22230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 22240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_effects[size] = (uint8_t)val; 22250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 22260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2227662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2228662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 2229662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_effects, 22300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2231662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 223247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX]; 2233e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t supported_indexes[CAM_SCENE_MODE_MAX]; 22342dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang int32_t supported_scene_modes_cnt = 0; 2235662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) { 22360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(SCENE_MODES_MAP, 2237b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 22380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_scene_modes[i]); 22390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 2240e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val; 2241e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_indexes[supported_scene_modes_cnt] = i; 22422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt++; 22430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2244662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2245e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2246662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 2247662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_scene_modes, 22482dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt); 2249662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 225047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3]; 2251e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides, 2252e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt, 2253e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 22549443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supported_indexes, 22559443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab cameraId); 2256e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 2257e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 2258e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt*3); 2259e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 226047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX]; 22610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2262662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) { 22630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(ANTIBANDING_MODES_MAP, 2264b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 2265b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[cameraId]->supported_antibandings[i]); 22660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 22670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_antibanding_modes[size] = (uint8_t)val; 22680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 22690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 22700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2272662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 2273662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_antibanding_modes, 22740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2275662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 227647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX]; 22770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2278662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) { 22790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FOCUS_MODES_MAP, 2280b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 22810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_focus_modes[i]); 22820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 22830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_af_modes[size] = (uint8_t)val; 22840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 22850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2286662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 2288662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_af_modes, 22890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2290662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 229147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_awb_modes[CAM_WB_MODE_MAX]; 22920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2293662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) { 22940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP, 2295b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 22960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_white_balances[i]); 22970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 22980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_awb_modes[size] = (uint8_t)val; 22990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 23000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2301662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2302662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 2303662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_awb_modes, 23040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2305662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2306a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX]; 2307a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++) 2308a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i]; 2309a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava 2310a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava staticInfo.update(ANDROID_FLASH_FIRING_POWER, 2311a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava available_flash_levels, 2312a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava gCamCapability[cameraId]->supported_flash_firing_level_cnt); 2313a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava 2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 231500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang uint8_t flashAvailable = gCamCapability[cameraId]->flash_available; 2316e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE, 2317e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang &flashAvailable, 1); 2318e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2319e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t avail_ae_modes[5]; 2320e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size = 0; 2321e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) { 2322e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i]; 2323e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size++; 2324e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2325e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (flashAvailable) { 2326e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; 2327e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; 2328e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; 2329e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2330662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 2331662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_ae_modes, 2332e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size); 2333ea44a483c0e98200c058a85ea339457616516847Zhijun He 2334e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t sensitivity_range[2]; 2335e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity; 2336e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity; 2337ea44a483c0e98200c058a85ea339457616516847Zhijun He staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, 2338ea44a483c0e98200c058a85ea339457616516847Zhijun He sensitivity_range, 2339ea44a483c0e98200c058a85ea339457616516847Zhijun He sizeof(sensitivity_range) / sizeof(int32_t)); 23402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 234173c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, 234273c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy &gCamCapability[cameraId]->max_analog_sensitivity, 234300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 1); 234400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 234573c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 2346e936796df0426c326d043c2359c149024526f4bcShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 2347e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 234873c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy 234900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle; 235000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang staticInfo.update(ANDROID_SENSOR_ORIENTATION, 235100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang &sensor_orientation, 235200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 1); 235300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 235400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang int32_t max_output_streams[3] = {1, 3, 1}; 235500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, 235600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang max_output_streams, 235700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 3); 235800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 2359b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang gStaticMetadata[cameraId] = staticInfo.release(); 2360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2364662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : makeTable 2365662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2366662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes 2367662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2368662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2369662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2370662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2371662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2372662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size, 2373662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t* sizeTable) 2374662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2375662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int j = 0; 2376662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < size; i++) { 2377662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j] = dimTable[i].width; 2378662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j+1] = dimTable[i].height; 2379662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole j+=2; 2380662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2381662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 23820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 23830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*=========================================================================== 23840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : makeFPSTable 23850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 23860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges 23870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 23880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS : 23890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 23900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/ 23910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size, 2392c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang int32_t* fpsRangesTable) 23930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{ 23940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int j = 0; 23950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < size; i++) { 2396c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps; 2397c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps; 23980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole j+=2; 23990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole} 24012dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 24022dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*=========================================================================== 24032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION : makeOverridesList 24042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides 24062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24072dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS : 24082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/ 24112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable, 2412e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t size, uint8_t* overridesList, 24139443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t* supported_indexes, 24149443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int camera_id) 24152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{ 24162dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*daemon will give a list of overrides for all scene modes. 24172dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang However we should send the fwk only the overrides for the scene modes 24182dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported by the framework*/ 24199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int j = 0, index = 0, supt = 0; 24209443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t focus_override; 24212dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang for (int i = 0; i < size; i++) { 24229443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 0; 2423e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang index = supported_indexes[i]; 2424e310738e63535838ed4659a55d540b75abc84c19Ajay Dudani overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON; 24259443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP, 24269443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 24279443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesTable[index].awb_mode); 24289443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override = (uint8_t)overridesTable[index].af_mode; 24299443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) { 24309443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) { 24319443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 1; 24329443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab break; 24339443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 24349443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 24359443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (supt) { 24369443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP, 24379443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 24389443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override); 24399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } else { 24409443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF; 24419443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 24422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang j+=3; 24432dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang } 24442dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang} 24452dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2447662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : getPreviewHalPixelFormat 2448662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2449662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework 2450662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2451662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend 2452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN : format recognized by framework 2454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format) 2457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t halPixelFormat; 2459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2460662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole switch (format) { 2461662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV12: 2462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; 2463662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2464662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21: 2465662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2466662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2467662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21_ADRENO: 2468662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO; 2469662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2470662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_YV12: 2471662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YV12; 2472662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2473662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV16: 2474662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV61: 2475662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole default: 2476662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2478662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2479662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return halPixelFormat; 2480662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2481662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2482662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 24833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION : getSensorSensitivity 24843fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 24853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value 24863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 24873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor 24883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 24893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN : sensitivity supported by sensor 24903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 24913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/ 24923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode) 24933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{ 24943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang int32_t sensitivity; 24953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 24963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang switch (iso_mode) { 24973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_100: 24983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 100; 24993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_200: 25013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 200; 25023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_400: 25043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 400; 25053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_800: 25073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 800; 25083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_1600: 25103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 1600; 25113fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang default: 25133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = -1; 25143fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25153fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 25163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang return sensitivity; 25173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang} 25183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 25193fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 25203fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*=========================================================================== 2521662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : AddSetParmEntryToBatch 2522662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2523662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch 2524662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @p_table : ptr to parameter buffer 2527662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramType : parameter type 2528662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramLength : length of parameter value 2529662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramValue : ptr to parameter value 2530662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2531662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2532662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 2533662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2534662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2535662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table, 2536662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole cam_intf_parm_type_t paramType, 2537662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint32_t paramLength, 2538662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole void *paramValue) 2539662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2540662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int position = paramType; 2541662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int current, next; 2542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2544662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Code to take care of linking next flags * 2545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_FIRST_PARAM_ID(p_table); 2547662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position == current){ 2548662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //DO NOTHING 2549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else if (position < current){ 2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, current); 2551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_FIRST_PARAM_ID(p_table, position); 2552662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 2553662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /* Search for the position in the linked list where we need to slot in*/ 2554662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole while (position > GET_NEXT_PARAM_ID(current, p_table)) 2555662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_NEXT_PARAM_ID(current, p_table); 2556662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2557662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*If node already exists no need to alter linking*/ 2558662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position != GET_NEXT_PARAM_ID(current, p_table)) { 2559662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole next = GET_NEXT_PARAM_ID(current, p_table); 2560662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(current, p_table, position); 2561662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, next); 2562662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2563662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2564662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2565662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2566662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Copy contents into entry * 2567662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2568662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2569662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (paramLength > sizeof(parm_type_t)) { 2570662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:Size of input larger than max entry size",__func__); 2571662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2572662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2573662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength); 2574662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NO_ERROR; 2575662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2576662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2577662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2578662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupFwkName 2579662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2580662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2581662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2582662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2583662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2584662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2585662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2586662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @hal_name : name of the hal_parm to map 2587662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2588662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int type of status 2589662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * fwk_name -- success 2590662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2591662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 25920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[], 2593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int hal_name) 2594662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2595662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2596d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (int i = 0; i < len; i++) { 2597d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang if (arr[i].hal_name == hal_name) 2598d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return arr[i].fwk_name; 2599662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2600d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 2601d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* Not able to find matching framework type is not necessarily 2602d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * an error case. This happens when mm-camera supports more attributes 2603d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * than the frameworks do */ 2604d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Cannot find matching framework type", __func__); 2605d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return NAME_NOT_FOUND; 2606662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2607662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2608662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupHalName 2610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2614662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @fwk_name : name of the hal_parm to map 2618662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2619662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2620662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * hal_name -- success 2621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2622662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 26230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[], 2624662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int fwk_name) 2625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 2627662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].fwk_name == fwk_name) 2628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].hal_name; 2629662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Cannot find matching hal type", __func__); 2631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NAME_NOT_FOUND; 2632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 2636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 2638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 2642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 2645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 2646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 2648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 2649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 2651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 2653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 2654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 2656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2660b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang if (NULL == gStaticMetadata[cameraId]) { 2661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 2662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 2668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 2669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 2670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 2673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 2674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 2678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 2679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 2684c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang info->device_version = CAMERA_DEVICE_API_VERSION_3_0; 2685b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang info->static_camera_characteristics = gStaticMetadata[cameraId]; 2686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 2692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 2694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 2696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 2699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 2700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 270297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type) 2703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2704e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 2705e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 2707e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 2711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 271297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata settings; 2713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 2714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 2715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 2716625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 2718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 2720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 2721625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 2722625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 2723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2724625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 2725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 2726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 2728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 2729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 2731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 2732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 2734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 2735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 2738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 2741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 27429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 27439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 2744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 2746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 2747625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2748625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 2749625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 2750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 2752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 2753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 2755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 2756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 2758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 2759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2760625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 2761625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 2762625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2763e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t focusMode; 2764e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) { 2765e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to auto", __func__); 2766e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_AUTO; 2767e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2768e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to off", __func__); 2769e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_OFF; 2770e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 27712dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1); 27722dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 27732dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; 27742dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 27752dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 2777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 2778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 2779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2780a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4; 2781a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava settings.update(ANDROID_FLASH_FIRING_POWER, 2782a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava &flashFiringLevel, 1); 2783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 278547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_aperture = gCamCapability[mCameraId]->apertures[0]; 2786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 2787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2788b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang if (gCamCapability[mCameraId]->filter_densities_count) { 278947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 2790b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 2791b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[mCameraId]->filter_densities_count); 2792b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang } 2793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 27949a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang float default_focal_length = gCamCapability[mCameraId]->focal_length; 27959a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 2796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 279762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang /* frame duration */ 279862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int64_t default_frame_duration = NSEC_PER_33MSEC; 279962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang settings.update(ANDROID_SENSOR_FRAME_DURATION, &default_frame_duration, 1); 280062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 280162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang /* sensitivity */ 280262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t default_sensitivity = 100; 280362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1); 280462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 2805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 2806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2810625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2811625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 281280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 281380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 281480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 281580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 281680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 281780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 281862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * @request : request that needs to be serviced 281934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * @streamTypeMask : bit mask of stream types on which buffers are requested 282080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 282180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 282280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 282380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 282462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(camera3_capture_request_t *request, 282562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang uint32_t streamTypeMask) 282680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 282780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 282880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 282962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (request->settings == NULL && mFirstRequest) { 283080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 283180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 2832662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 283333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2834b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 2835b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang 2836b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 283733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 283862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 2839b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(hal_version), &hal_version); 284062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (rc < 0) { 284162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGE("%s: Failed to set hal version in the parameters", __func__); 284262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return BAD_VALUE; 284362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 284433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2845662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*we need to update the frame number in the parameters*/ 2846662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 284762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang sizeof(request->frame_number), &(request->frame_number)); 2848662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (rc < 0) { 2849662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s: Failed to set the frame number in the parameters", __func__); 2850662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2851662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 28520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 285334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy /* Update stream id mask where buffers are requested */ 285434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK, 285534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy sizeof(streamTypeMask), &streamTypeMask); 285634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy if (rc < 0) { 285734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy ALOGE("%s: Failed to set stream type mask in the parameters", __func__); 285834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy return BAD_VALUE; 285934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy } 286034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy 286162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if(request->settings != NULL){ 286262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = translateMetadataToParameters(request); 286380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 286480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 2865662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 286680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 286780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 286880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 286980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 287080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 287180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 287280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 287380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 287480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 287580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 287662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * @request : request sent from framework 287780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 287880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 287980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 288080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 288180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 288280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 288362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang (const camera3_capture_request_t *request) 288480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 2885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 288697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata frame_settings; 288762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang frame_settings = request->settings; 28880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) { 28900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t antibandingMode = 28910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0]; 28920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING, 28930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(antibandingMode), &antibandingMode); 28940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 289597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 289653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 2897e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t expCompensation = frame_settings.find( 2898e936796df0426c326d043c2359c149024526f4bcShuzhen Wang ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 2899fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min) 2900fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_compensation_min; 2901fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max) 2902fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_compensation_max; 290353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION, 290453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab sizeof(expCompensation), &expCompensation); 290553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 290653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab 29070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) { 29080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0]; 29090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK, 29100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeLock), &aeLock); 29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) { 29130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_fps_range_t fps_range; 29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.min_fps = 29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 29160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.max_fps = 29179443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1]; 29180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE, 29190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(fps_range), &fps_range); 29200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 292197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 29222b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang float focalDistance = -1.0; 29232b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) { 29242b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0]; 29252b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 29262b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang CAM_INTF_META_LENS_FOCUS_DISTANCE, 29272b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang sizeof(focalDistance), &focalDistance); 29282b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } 29292b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang 29300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) { 29312dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang uint8_t fwk_focusMode = 29320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0]; 29332b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang uint8_t focusMode; 29342b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) { 29352b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focusMode = CAM_FOCUS_MODE_INFINITY; 29362b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } else{ 29372b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focusMode = lookupHalName(FOCUS_MODES_MAP, 29382b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang sizeof(FOCUS_MODES_MAP), 29392b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang fwk_focusMode); 29402b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } 29410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE, 29420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focusMode), &focusMode); 29430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 29450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) { 29460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t awbLock = 29470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0]; 29480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK, 29490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(awbLock), &awbLock); 29500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) { 29530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_whiteLevel = 29540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0]; 29550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP, 29560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(WHITE_BALANCE_MODES_MAP), 29570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_whiteLevel); 29580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE, 29590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(whiteLevel), &whiteLevel); 29600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) { 29630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_effectMode = 29640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0]; 29650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP, 29660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(EFFECT_MODES_MAP), 29670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_effectMode); 29680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT, 29690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(effectMode), &effectMode); 29700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 29730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_aeMode = 29740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 2975e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t aeMode; 2976e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t redeye; 29776356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani 2978e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) { 2979e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_OFF; 2980e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2981e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_ON; 2982e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2983e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 2984e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 1; 2985e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2986e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 0; 2987e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 29886356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani 2989e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP, 2990e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(AE_FLASH_MODE_MAP), 2991f7d51831acde505c8cda8e60ab651b113326c6b7Shuzhen Wang fwk_aeMode); 29920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE, 29930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeMode), &aeMode); 2994e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 2995e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(flashMode), &flashMode); 2996e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION, 2997e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(redeye), &redeye); 29980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) { 30010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t colorCorrectMode = 30020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0]; 30030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = 30040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE, 30050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(colorCorrectMode), &colorCorrectMode); 30060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3007d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3008d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) { 3009d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_gains_t colorCorrectGains; 3010d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int i = 0; i < 4; i++) { 3011d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy colorCorrectGains.gains[i] = 3012d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i]; 3013d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3014d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = 3015d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_GAINS, 3016d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(colorCorrectGains), &colorCorrectGains); 3017d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3018d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3019d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) { 3020d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_matrix_t colorCorrectTransform; 3021d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_rational_type_t transform_elem; 3022d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy int num = 0; 3023d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int i = 0; i < 3; i++) { 3024d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 3; j++) { 3025d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy transform_elem.numerator = 3026d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator; 3027d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy transform_elem.denominator = 3028d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator; 3029d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy colorCorrectTransform.transform_matrix[i][j] = transform_elem; 3030d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy num++; 3031d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3032d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3033d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = 3034d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_TRANSFORM, 3035d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(colorCorrectTransform), &colorCorrectTransform); 3036d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3037d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3038e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang cam_trigger_t aecTrigger; 3039e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE; 3040e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger_id = -1; 30412dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&& 30422dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) { 30432dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger = 30440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0]; 30452dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger_id = 30462dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0]; 30470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, 30491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(aecTrigger), &aecTrigger); 30500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30512dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*af_trigger must come with a trigger id*/ 30522dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) && 30532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) { 30542dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang cam_trigger_t af_trigger; 30552dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger = 30560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0]; 30572dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger_id = 30582dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0]; 30590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 30602dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger); 30610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_MODE)) { 30640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0]; 30650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE, 30660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(metaMode), &metaMode); 30679443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) { 30689443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0]; 30699443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP, 30709443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 30719443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab fwk_sceneMode); 30729443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 3073827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab sizeof(sceneMode), &sceneMode); 3074827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab } else if (metaMode == ANDROID_CONTROL_MODE_OFF) { 3075827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 3076827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 3077827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab sizeof(sceneMode), &sceneMode); 3078827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) { 3079827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 3080827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 30819443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(sceneMode), &sceneMode); 30829443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 30830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) { 30860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t demosaic = 30870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0]; 30880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC, 30890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(demosaic), &demosaic); 30900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_MODE)) { 30930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 3094d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE_MODE, 30950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(edgeMode), &edgeMode); 30960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) { 30990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t edgeStrength = 31000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0]; 31010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 31020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength); 31030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 3105e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (frame_settings.exists(ANDROID_FLASH_MODE)) { 31066356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani int32_t respectFlashMode = 1; 31076356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 31086356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t fwk_aeMode = 31096356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 31106356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) { 31116356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani respectFlashMode = 0; 31126356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: AE Mode controls flash, ignore android.flash.mode", 31136356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani __func__); 31146356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 31156356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 31166356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (respectFlashMode) { 31176356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t flashMode = 31186356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_FLASH_MODE).data.u8[0]; 31196356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP, 31206356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(FLASH_MODES_MAP), 31216356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode); 31226356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: flash mode after mapping %d", __func__, flashMode); 31236356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani // To check: CAM_INTF_META_FLASH_MODE usage 31246356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 31256356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(flashMode), &flashMode); 31266356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 3127e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 3128e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 31290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) { 31300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t flashPower = 31310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0]; 31320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER, 31330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(flashPower), &flashPower); 31340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) { 31370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t flashFiringTime = 31380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0]; 31390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 31400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime); 31410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) { 31440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t geometricMode = 31450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0]; 31460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE, 31470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricMode), &geometricMode); 31480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) { 31518867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t geometricStrength = 31520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0]; 31530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 31540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_GEOMETRIC_STRENGTH, 31550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricStrength), &geometricStrength); 31560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) { 31590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t hotPixelMode = 31600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0]; 31610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE, 31620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(hotPixelMode), &hotPixelMode); 31630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_APERTURE)) { 31660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float lensAperture = 31670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find( ANDROID_LENS_APERTURE).data.f[0]; 31680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE, 31690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(lensAperture), &lensAperture); 31700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) { 31730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float filterDensity = 31740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0]; 31750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY, 31760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(filterDensity), &filterDensity); 31770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 31800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float focalLength = 31810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 31820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 31830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_FOCAL_LENGTH, 31840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focalLength), &focalLength); 31850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) { 31880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t optStabMode = 31890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0]; 31908867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 31910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_OPT_STAB_MODE, 31920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(optStabMode), &optStabMode); 31930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) { 31960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedMode = 31970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]; 31988867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 31990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_MODE, 32000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedMode), &noiseRedMode); 32010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) { 32040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedStrength = 32050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0]; 32068867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 32070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_STRENGTH, 32080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedStrength), &noiseRedStrength); 32090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 321171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang cam_crop_region_t scalerCropRegion; 321271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool scalerCropSet = false; 32130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) { 32140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.left = 32150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0]; 32160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.top = 32170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1]; 32180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.width = 32190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2]; 322047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang scalerCropRegion.height = 322147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3]; 32220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SCALER_CROP_REGION, 32240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(scalerCropRegion), &scalerCropRegion); 322571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropSet = true; 32260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { 32290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorExpTime = 32300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0]; 323162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: setting sensorExpTime %lld", __func__, sensorExpTime); 32320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_EXPOSURE_TIME, 32340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorExpTime), &sensorExpTime); 32350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) { 32380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorFrameDuration = 32390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0]; 324062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int64_t minFrameDuration = getMinFrameDuration(request); 324162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang sensorFrameDuration = MAX(sensorFrameDuration, minFrameDuration); 3242e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration) 3243e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration; 324462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: clamp sensorFrameDuration to %lld", __func__, sensorFrameDuration); 32450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_FRAME_DURATION, 32470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorFrameDuration), &sensorFrameDuration); 32480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 32510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t sensorSensitivity = 32520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 3253e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity < 3254e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity) 3255e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 3256e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity; 3257e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity > 3258e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity) 3259e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 3260e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity; 326162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: clamp sensorSensitivity to %d", __func__, sensorSensitivity); 32620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_SENSITIVITY, 32640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorSensitivity), &sensorSensitivity); 32650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_MODE)) { 32680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t shadingMode = 32690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_MODE).data.u8[0]; 32700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE, 32710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingMode), &shadingMode); 32720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) { 32750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t shadingStrength = 32760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0]; 32770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH, 32780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingStrength), &shadingStrength); 32790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) { 32826990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t fwk_facedetectMode = 32830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0]; 32846990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t facedetectMode = 32856990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang lookupHalName(FACEDETECT_MODES_MAP, 32866990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode); 32870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_FACEDETECT_MODE, 32890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(facedetectMode), &facedetectMode); 32900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) { 32930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t histogramMode = 32940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0]; 32950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_HISTOGRAM_MODE, 32970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(histogramMode), &histogramMode); 32980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) { 33010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t sharpnessMapMode = 33020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0]; 33030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 33040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, 33050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sharpnessMapMode), &sharpnessMapMode); 33060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_TONEMAP_MODE)) { 33090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t tonemapMode = 33100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0]; 33110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 33120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_TONEMAP_MODE, 33130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(tonemapMode), &tonemapMode); 33140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3315e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* Tonemap curve channels ch0 = G, ch 1 = B, ch 2 = R */ 3316e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /*All tonemap channels will have the same number of points*/ 3317e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN) && 3318e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE) && 3319e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) { 3320e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_rgb_tonemap_curves tonemapCurves; 3321e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.tonemap_points_cnt = frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).count/2; 3322e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3323e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch0 = G*/ 3324e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang int point = 0; 3325e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_tonemap_curve_t tonemapCurveGreen; 3326e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt ; i++) { 3327d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3328e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurveGreen.tonemap_points[i][j] = 3329e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point]; 3330d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3331d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3332d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3333e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[0] = tonemapCurveGreen; 3334e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3335e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch 1 = B */ 3336e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang point = 0; 3337e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_tonemap_curve_t tonemapCurveBlue; 3338e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 3339d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3340e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurveBlue.tonemap_points[i][j] = 3341e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point]; 3342d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3343d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3344d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3345e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[1] = tonemapCurveBlue; 3346e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3347e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch 2 = R */ 3348e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang point = 0; 3349d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_tonemap_curve_t tonemapCurveRed; 3350e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 3351d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3352d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy tonemapCurveRed.tonemap_points[i][j] = 3353d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point]; 3354d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3355d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3356d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3357e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[2] = tonemapCurveRed; 3358e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3359d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, 3360e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang CAM_INTF_META_TONEMAP_CURVES, 3361e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang sizeof(tonemapCurves), &tonemapCurves); 3362d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 33630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 33650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t captureIntent = 33660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 33670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 33680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(captureIntent), &captureIntent); 33690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3370662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3371d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) { 3372d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t blackLevelLock = 3373d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0]; 3374d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_BLACK_LEVEL_LOCK, 3375d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(blackLevelLock), &blackLevelLock); 3376d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3377d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3378d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) { 3379d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t lensShadingMapMode = 3380d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0]; 3381d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE, 3382d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(lensShadingMapMode), &lensShadingMapMode); 3383d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3384d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 338559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) { 338659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 338771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 338862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AE_REGIONS); 338971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 339071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 339171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 339271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 339371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI, 339471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 339571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 339659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 339759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 339859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) { 339959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 340071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 340162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AF_REGIONS); 340271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 340371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 340471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 340571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 340671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI, 340771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 340871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 340959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 341059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 341159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) { 341259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 341371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 341462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AWB_REGIONS); 341571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 341671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 341771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 341871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 341971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS, 342071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 342171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 342259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 3423662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 3424662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 3425662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3426662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 34270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : getJpegSettings 3428662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 34290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL 3430662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3431662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3432662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 3433662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @settings : frame settings information from framework 3434662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3435662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3436662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : success: NO_ERROR 3437662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * failure: 3438662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 3439662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings 3440662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (const camera_metadata_t *settings) 3441662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 3442662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (mJpegSettings) { 34439a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_timestamp) { 34449a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_timestamp); 34459a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 34469a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 34479a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_coordinates) { 34489a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 34499a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_coordinates[i]); 34509a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 34519a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 34529a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 3453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole free(mJpegSettings); 3454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = NULL; 3455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 3456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t)); 345797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata jpeg_settings; 3458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings = settings; 3459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 34600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) { 34610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 34620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0]; 34630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 34640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 0; 34650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) { 34670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_quality = 34680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0]; 34690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 34701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mJpegSettings->jpeg_quality = 85; 34710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) { 34730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.width = 34740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0]; 34750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.height = 34760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1]; 34770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 347808ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.width = 0; 347908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.height = 0; 34800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) { 34820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < 3; i++) { 34839a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*)); 34849a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_coordinates[i]) = 34850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i]; 34860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else{ 34889a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 34899a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 34903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 34910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34929a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 34930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { 34949a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*)); 34959a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_timestamp) = 34960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0]; 34979a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 34989a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 34990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { 35029a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count; 35039a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < len; i++) { 35049a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[i] = 35059a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i]; 35069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 35079a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_processing_method[len-1] != '\0') { 35089a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[len] = '\0'; 35099a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 35109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 35119a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[0] = '\0'; 35120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 35140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 35150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->sensor_sensitivity = 35160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 35173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else { 35183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed; 35190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35209a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 35210b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi mJpegSettings->sensor_exposure_time = mMetadataResponse.exposure_time; 35220b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi 35230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 35240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->lens_focal_length = 35250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 35260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 352753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 352853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_compensation = 352953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 353053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 353153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step; 35320a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab mJpegSettings->max_jpeg_size = calcMaxJpegSize(); 35337ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->is_jpeg_format = true; 35347ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask; 353580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 353680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 353780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 353880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 3539e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 3540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 3542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 3545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 3546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 3547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 3549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 35501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata, 3551e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, 3552e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frame_number, void *userdata) 3553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 3555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 3556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 3557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3560e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->captureResultCb(metadata, buffer, frame_number); 3561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 35647ee407aa1024789089aad411c372c79423699976Ajay Dudani 3565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 3567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 3569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 3574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 3575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 3578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 3579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3580d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 35881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->initialize(callback_ops); 3589d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 35901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3593625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 3595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 3602625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 3603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 3604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 3607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3608625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 3609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3610d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3611625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3615625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3616625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 36171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->configureStreams(stream_list); 3618d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 36191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 3624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 3626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 3632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 3634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3635d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 36421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->registerStreamBuffers(buffer_set); 3643d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 36441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 3649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 3651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 3656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 3657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 36589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 36599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 36609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 3661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3663d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 3665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 3670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 367297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole fwk_metadata = hw->translateCapabilityToMetadata(type); 3673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3674d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 3676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 3680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 36889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 36899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 36909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 3691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3692d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 369380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 369480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 369580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 369680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 36979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 369880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 36999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 37001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->processCaptureRequest(request); 3701d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 37021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 3707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3716e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops( 3717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, 3718e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang vendor_tag_query_ops_t* ops) 3719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3720d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->getMetadataVendorTagOps(ops); 3729d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 3735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump( 3745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, int fd) 3746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3747d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->dump(fd); 3756d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3757e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 3761c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION : flush 3762c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3763c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION: 3764c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3765c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS : 3766c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3767c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3768c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN : 3769c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/ 3770c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 3771c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush( 3772c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang const struct camera3_device *device) 3773c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{ 3774c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang int rc; 3775c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGV("%s: E", __func__); 3776c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang QCamera3HardwareInterface *hw = 3777c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3778c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang if (!hw) { 3779c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGE("%s: NULL camera device", __func__); 3780c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return -EINVAL; 3781c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang } 3782c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 3783c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang rc = hw->flush(); 3784c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGV("%s: X", __func__); 3785c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return rc; 3786c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang} 3787c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 3788c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*=========================================================================== 3789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : close_camera_device 3790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 3792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 3794e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3795e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3796e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 3797e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 3798e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 3799e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 3800d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3801e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int ret = NO_ERROR; 3802e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3803e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>( 3804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<camera3_device_t *>(device)->priv); 3805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("NULL camera device"); 3807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return BAD_VALUE; 3808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3809e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete hw; 3810cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 3811cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 3812cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 0; 3813cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 3814d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return ret; 3816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 3817e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 38187ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 38197ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : getWaveletDenoiseProcessPlate 38207ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38217ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate 38227ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38237ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None 38247ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38257ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : WNR prcocess plate vlaue 38267ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 38277ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate() 38287ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 38297ee407aa1024789089aad411c372c79423699976Ajay Dudani char prop[PROPERTY_VALUE_MAX]; 38307ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(prop, 0, sizeof(prop)); 38317ee407aa1024789089aad411c372c79423699976Ajay Dudani property_get("persist.denoise.process.plates", prop, "0"); 38327ee407aa1024789089aad411c372c79423699976Ajay Dudani int processPlate = atoi(prop); 38337ee407aa1024789089aad411c372c79423699976Ajay Dudani switch(processPlate) { 38347ee407aa1024789089aad411c372c79423699976Ajay Dudani case 0: 38357ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_YCBCR_PLANE; 38367ee407aa1024789089aad411c372c79423699976Ajay Dudani case 1: 38377ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_CBCR_ONLY; 38387ee407aa1024789089aad411c372c79423699976Ajay Dudani case 2: 38397ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 38407ee407aa1024789089aad411c372c79423699976Ajay Dudani case 3: 38417ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINED_CBCR; 38427ee407aa1024789089aad411c372c79423699976Ajay Dudani default: 38437ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 38447ee407aa1024789089aad411c372c79423699976Ajay Dudani } 38457ee407aa1024789089aad411c372c79423699976Ajay Dudani} 38467ee407aa1024789089aad411c372c79423699976Ajay Dudani 38477ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 38487ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : needRotationReprocess 38497ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38507ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp 38517ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38527ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 38537ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38547ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : true: needed 38557ee407aa1024789089aad411c372c79423699976Ajay Dudani * false: no need 38567ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 38577ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess() 38587ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 38597ee407aa1024789089aad411c372c79423699976Ajay Dudani 38607ee407aa1024789089aad411c372c79423699976Ajay Dudani if (!mJpegSettings->is_jpeg_format) { 38617ee407aa1024789089aad411c372c79423699976Ajay Dudani // RAW image, no need to reprocess 38627ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 38637ee407aa1024789089aad411c372c79423699976Ajay Dudani } 38647ee407aa1024789089aad411c372c79423699976Ajay Dudani 38657ee407aa1024789089aad411c372c79423699976Ajay Dudani if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 && 38667ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->jpeg_orientation > 0) { 38677ee407aa1024789089aad411c372c79423699976Ajay Dudani // current rotation is not zero, and pp has the capability to process rotation 38687ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGD("%s: need do reprocess for rotation", __func__); 38697ee407aa1024789089aad411c372c79423699976Ajay Dudani return true; 38707ee407aa1024789089aad411c372c79423699976Ajay Dudani } 38717ee407aa1024789089aad411c372c79423699976Ajay Dudani 38727ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 38737ee407aa1024789089aad411c372c79423699976Ajay Dudani} 38747ee407aa1024789089aad411c372c79423699976Ajay Dudani 38757ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 3876c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * FUNCTION : needReprocess 3877c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 3878c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * DESCRIPTION: if reprocess in needed 3879c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 3880c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * PARAMETERS : none 3881c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 3882c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * RETURN : true: needed 3883c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * false: no need 3884c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *==========================================================================*/ 3885c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajanbool QCamera3HardwareInterface::needReprocess() 3886c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan{ 3887c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if (!mJpegSettings->is_jpeg_format) { 3888c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // RAW image, no need to reprocess 3889c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return false; 3890c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 3891c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 3892c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if ((mJpegSettings->min_required_pp_mask > 0) || 3893c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan isWNREnabled()) { 3894c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // TODO: add for ZSL HDR later 3895c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // pp module has min requirement for zsl reprocess, or WNR in ZSL mode 3896c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__); 3897c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return true; 3898c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 3899c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return needRotationReprocess(); 3900c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan} 3901c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 3902c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan/*=========================================================================== 39037ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : addOnlineReprocChannel 39047ee407aa1024789089aad411c372c79423699976Ajay Dudani * 39057ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames 39067ee407aa1024789089aad411c372c79423699976Ajay Dudani * coming from input channel 39077ee407aa1024789089aad411c372c79423699976Ajay Dudani * 39087ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 39097ee407aa1024789089aad411c372c79423699976Ajay Dudani * @pInputChannel : ptr to input channel whose frames will be post-processed 39107ee407aa1024789089aad411c372c79423699976Ajay Dudani * 39117ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : Ptr to the newly created channel obj. NULL if failed. 39127ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 39137ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel( 3914d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle) 39157ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 39167ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t rc = NO_ERROR; 39177ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3ReprocessChannel *pChannel = NULL; 39187ee407aa1024789089aad411c372c79423699976Ajay Dudani if (pInputChannel == NULL) { 39197ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: input channel obj is NULL", __func__); 39207ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39217ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39227ee407aa1024789089aad411c372c79423699976Ajay Dudani 39237ee407aa1024789089aad411c372c79423699976Ajay Dudani pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle, 39247ee407aa1024789089aad411c372c79423699976Ajay Dudani mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle); 39257ee407aa1024789089aad411c372c79423699976Ajay Dudani if (NULL == pChannel) { 39267ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: no mem for reprocess channel", __func__); 39277ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39287ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39297ee407aa1024789089aad411c372c79423699976Ajay Dudani 39307ee407aa1024789089aad411c372c79423699976Ajay Dudani // Capture channel, only need snapshot and postview streams start together 39317ee407aa1024789089aad411c372c79423699976Ajay Dudani mm_camera_channel_attr_t attr; 39327ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 39337ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 39347ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue(); 39357ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->initialize(); 39367ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 39377ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc); 39387ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 39397ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39407ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39417ee407aa1024789089aad411c372c79423699976Ajay Dudani 39427ee407aa1024789089aad411c372c79423699976Ajay Dudani // pp feature config 39437ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_pp_feature_config_t pp_config; 39447ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&pp_config, 0, sizeof(cam_pp_feature_config_t)); 39457ee407aa1024789089aad411c372c79423699976Ajay Dudani if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) { 39467ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS; 39477ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.sharpness = 10; 39487ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39497ee407aa1024789089aad411c372c79423699976Ajay Dudani 39507ee407aa1024789089aad411c372c79423699976Ajay Dudani if (isWNREnabled()) { 39517ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D; 39527ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.denoise_enable = 1; 39537ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate(); 39547ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39557ee407aa1024789089aad411c372c79423699976Ajay Dudani if (needRotationReprocess()) { 39567ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION; 39577ee407aa1024789089aad411c372c79423699976Ajay Dudani int rotation = mJpegSettings->jpeg_orientation; 39587ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rotation == 0) { 39597ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_0; 39607ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 90) { 39617ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_90; 39627ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 180) { 39637ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_180; 39647ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 270) { 39657ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_270; 39667ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39677ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39687ee407aa1024789089aad411c372c79423699976Ajay Dudani 39697ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->addReprocStreamsFromSource(pp_config, 39707ee407aa1024789089aad411c372c79423699976Ajay Dudani pInputChannel, 39717ee407aa1024789089aad411c372c79423699976Ajay Dudani mMetadataChannel); 39727ee407aa1024789089aad411c372c79423699976Ajay Dudani 39737ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 39747ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 39757ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39767ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39777ee407aa1024789089aad411c372c79423699976Ajay Dudani return pChannel; 39787ee407aa1024789089aad411c372c79423699976Ajay Dudani} 39797ee407aa1024789089aad411c372c79423699976Ajay Dudani 39807ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue() 39817ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 39827ee407aa1024789089aad411c372c79423699976Ajay Dudani return gCamCapability[mCameraId]->min_num_pp_bufs; 39837ee407aa1024789089aad411c372c79423699976Ajay Dudani} 39847ee407aa1024789089aad411c372c79423699976Ajay Dudani 3985acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajanbool QCamera3HardwareInterface::isWNREnabled() { 3986acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan return gCamCapability[mCameraId]->isWnrSupported; 3987acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan} 3988acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan 3989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 3990