QCamera3HWI.cpp revision d363f94a30706c0f951d037b3601bc2a0b445837
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; 475d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang cam_stream_size_info_t stream_config_info; 476d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang 4770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /* first invalidate all the steams in the mStreamList 4780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * if they appear again, they will be validated */ 4791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 481d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 482d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang channel->stop(); 4830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = INVALID; 4840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 485d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 488c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d", 489c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, newStream->stream_type, newStream->format, 490c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang newStream->width, newStream->height); 4910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //if the stream is in the mStreamList validate it 4920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole bool stream_exists = false; 4931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 4950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if ((*it)->stream == newStream) { 4961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = 4971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (QCamera3Channel*)(*it)->stream->priv; 4980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_exists = true; 4990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = RECONFIGURE; 5001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*delete the channel object associated with the stream because 5011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole we need to reconfigure*/ 5021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 5031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->stream->priv = NULL; 5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (!stream_exists) { 5070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //new stream 5080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info_t* stream_info; 5090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info = (stream_info_t* )malloc(sizeof(stream_info_t)); 5100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->stream = newStream; 5110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->status = VALID; 5121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole stream_info->registered = 0; 5130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mStreamInfo.push_back(stream_info); 5140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 515c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT 516c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) { 517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 519e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 524c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->format == HAL_PIXEL_FORMAT_BLOB) { 525c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream = newStream; 526c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 5300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /*clean up invalid streams*/ 5311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 5321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end();) { 5330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if(((*it)->status) == INVALID){ 5341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 5351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 5360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole delete[] (buffer_handle_t*)(*it)->buffer_set.buffers; 5370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole free(*it); 5381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it = mStreamInfo.erase(it); 5391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 5401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it++; 5410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 544020cc22e9d3b14bffb22f7c4ace81201d833aeacVineeta Srivastava //mMetadataChannel->stop(); 545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 549d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].width = newStream->width; 550d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].height = newStream->height; 551d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 552d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang newStream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED && jpegStream){ 553d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang //for zsl stream the size is jpeg size 554d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].width = jpegStream->width; 555d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.stream_sizes[i].height = jpegStream->height; 556d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang } 557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 560f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_INPUT: 561f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 562f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 563f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_BIDIRECTIONAL: 564f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 565f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab GRALLOC_USAGE_HW_CAMERA_WRITE; 566f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 567f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_OUTPUT: 568c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /* For video encoding stream, set read/write rarely 569c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * flag so that they may be set to un-cached */ 570c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang if (newStream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) 571c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang newStream->usage = 572c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang (GRALLOC_USAGE_SW_READ_RARELY | 573c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang GRALLOC_USAGE_SW_WRITE_RARELY | 574c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang GRALLOC_USAGE_HW_CAMERA_WRITE); 575c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang else 576c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 577f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 578f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 579f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 580f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 5841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 587f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 5888867984d33ed870071109a4500402dddbc85c048Shuzhen Wang case HAL_PIXEL_FORMAT_YCbCr_420_888: 589f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 590c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 591c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream) { 592c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t width = jpegStream->width; 593c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t height = jpegStream->height; 5948bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode = true; 595c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 596c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mCameraHandle->ops, captureResultCb, 597c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this, newStream, 598c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang width, height); 599c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else 600c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 601f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 602f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 603f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 604f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 605f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 606f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 607f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 608f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 609f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 610f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 611f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_BLOB: 612f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 6137ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle, 614f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 615f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 6167ee407aa1024789089aad411c372c79423699976Ajay Dudani if (mPictureChannel == NULL) { 617f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 618f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 619f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 620f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 6217ee407aa1024789089aad411c372c79423699976Ajay Dudani newStream->priv = (QCamera3Channel*)mPictureChannel; 622f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 623f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 624f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab //TODO: Add support for app consumed format? 625f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 626f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 627f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 6358867984d33ed870071109a4500402dddbc85c048Shuzhen Wang /*For the streams to be reconfigured we need to register the buffers 6361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole since the framework wont*/ 6371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 6381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 6391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->status == RECONFIGURE) { 6401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 6411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*only register buffers for streams that have already been 6421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole registered*/ 6431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->registered) { 6441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = channel->registerBuffers((*it)->buffer_set.num_buffers, 6451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers); 6461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (rc != NO_ERROR) { 6471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Failed to register the buffers of old stream,\ 6481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = %d", __func__, rc); 6491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 650a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: channel %p has %d buffers", 651e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, channel, (*it)->buffer_set.num_buffers); 6520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream); 6561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (index == NAME_NOT_FOUND) { 6571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.add((*it)->stream, 0); 6581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 6591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueAt(index) = 0; 6601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 6610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Initialize mPendingRequestInfo and mPendnigBuffersMap */ 6641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.clear(); 6651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 666d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab /*flush the metadata list*/ 667d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!mStoredMetadataList.empty()) { 668d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 669d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 670d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 671d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 672d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 673d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 674d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 675d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 676d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang stream_config_info.num_streams = streamList->num_streams; 677d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab 67833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang //settings/parameters don't carry over for new configureStreams 6799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 680d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang 681d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 682d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 683d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang sizeof(hal_version), &hal_version); 684d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang 685d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_INFO, 686d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang sizeof(stream_config_info), &stream_config_info); 687d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang 688d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 689d363f94a30706c0f951d037b3601bc2a0b445837Shuzhen Wang 69033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest = true; 69133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 69262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Get min frame duration for this streams configuration 69362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang deriveMinFrameDuration(); 69462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 695e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 69633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return rc; 697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 700e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : validateCaptureRequest 701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 702e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service 70380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 70480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 70580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 70680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 70780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 70880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 70980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 710e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest( 7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 71280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 7139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 7149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 7159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 7169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 7189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 7199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 7209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 7249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 7259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 7269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 7279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 7289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 7319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 7329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 7339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 736c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang b = request->input_buffer; 737c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel *channel = 738c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 739c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (channel == NULL) { 740c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 741c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 742c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 743c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 744c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 745c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 746c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 747c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 748c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 749c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->release_fence != -1) { 750c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 751c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 752c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 753c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 754c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->buffer == NULL) { 755c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 756c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 757c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 758c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 7599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 7629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 7639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 7649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 7659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 7669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 7679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 7689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 7729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 7739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 7779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 7789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 7829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 7839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 7879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 7889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 7899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 79462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION : deriveMinFrameDuration 79562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 79662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: derive mininum processed, jpeg, and raw frame durations based 79762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * on currently configured streams. 79862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 79962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : NONE 80062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 80162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN : NONE 80262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 80362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/ 80462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangvoid QCamera3HardwareInterface::deriveMinFrameDuration() 80562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{ 80662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t maxJpegDimension, maxProcessedDimension; 80762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 80862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxJpegDimension = 0; 80962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = 0; 81062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 81162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang // Figure out maximum jpeg, processed, and raw dimensions 81262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (List<stream_info_t*>::iterator it = mStreamInfo.begin(); 81362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang it != mStreamInfo.end(); it++) { 81462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 81562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang // Input stream doesn't have valid stream_type 81662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if ((*it)->stream->stream_type == CAMERA3_STREAM_INPUT) 81762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang continue; 81862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 81962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t dimension = (*it)->stream->width * (*it)->stream->height; 82062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if ((*it)->stream->format == HAL_PIXEL_FORMAT_BLOB) { 82162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (dimension > maxJpegDimension) 82262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxJpegDimension = dimension; 82362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } else if ((*it)->stream->format != HAL_PIXEL_FORMAT_RAW_SENSOR) { 82462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (dimension > maxProcessedDimension) 82562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = dimension; 82662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 82762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 82862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 82962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Assume all jpeg dimensions are in processed dimensions. 83062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (maxJpegDimension > maxProcessedDimension) 83162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang maxProcessedDimension = maxJpegDimension; 83262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 83362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang //Find minimum durations for processed, jpeg, and raw 83462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinRawFrameDuration = gCamCapability[mCameraId]->raw_min_duration; 83562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 83662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (maxProcessedDimension == 83762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang gCamCapability[mCameraId]->picture_sizes_tbl[i].width * 83862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang gCamCapability[mCameraId]->picture_sizes_tbl[i].height) { 83962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinProcessedFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i]; 84062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang mMinJpegFrameDuration = gCamCapability[mCameraId]->jpeg_min_duration[i]; 84162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang break; 84262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 84362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 84462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang} 84562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 84662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*=========================================================================== 84762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * FUNCTION : getMinFrameDuration 84862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 84962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * DESCRIPTION: get minimum frame draution based on the current maximum frame durations 85062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * and current request configuration. 85162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 85262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * PARAMETERS : @request: requset sent by the frameworks 85362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 85462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * RETURN : min farme duration for a particular request 85562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * 85662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang *==========================================================================*/ 85762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint64_t QCamera3HardwareInterface::getMinFrameDuration(const camera3_capture_request_t *request) 85862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang{ 85962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang bool hasJpegStream = false; 86062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang for (uint32_t i = 0; i < request->num_output_buffers; i ++) { 86162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang const camera3_stream_t *stream = request->output_buffers[i].stream; 86262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (stream->format == HAL_PIXEL_FORMAT_BLOB) 86362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang hasJpegStream = true; 86462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 86562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 86662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (!hasJpegStream) 86762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return MAX(mMinRawFrameDuration, mMinProcessedFrameDuration); 86862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang else 86962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return MAX(MAX(mMinRawFrameDuration, mMinProcessedFrameDuration), mMinJpegFrameDuration); 87062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang} 87162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 87262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang/*=========================================================================== 873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : registerStreamBuffers 874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 877e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 878e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @stream_list : streams to be configured 879e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 880e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 881e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 882e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 883e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 884e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 885e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 886e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = 0; 887e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 889e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 890e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set == NULL) { 891e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 892e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 893e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 894e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 895e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->stream == NULL) { 896e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 897e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 898e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 899e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 900e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->num_buffers < 1) { 901e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 902e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 903e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 904e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 905e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->buffers == NULL) { 906e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 907e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 908e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 909e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 910e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 911e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 912e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 913e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 9140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //set the buffer_set in the mStreamInfo array 9151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 9161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 9171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->stream == stream) { 9180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint32_t numBuffers = buffer_set->num_buffers; 9191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.stream = buffer_set->stream; 9201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.num_buffers = numBuffers; 9211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers]; 9221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->buffer_set.buffers == NULL) { 9230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Failed to allocate buffer_handle_t*", __func__); 9240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_unlock(&mMutex); 9250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole return -ENOMEM; 9260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (size_t j = 0; j < numBuffers; j++){ 9281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers[j] = buffer_set->buffers[j]; 9290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->registered = 1; 9310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 9320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 933e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 934e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 935e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 936e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 937e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENODEV; 938e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 939e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 940e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 941e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 943e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 944e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 945e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : processCaptureRequest 946e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 947e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service 948e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 949e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 950e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @request : request from framework to process 951e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 952e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 953e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 954e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 955e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 956e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_request_t *request) 957e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 958e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = NO_ERROR; 95974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id; 960e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata meta; 961d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo reproc_meta; 962d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int queueMetadata = 0; 963e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 964e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 9662123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang rc = validateCaptureRequest(request); 9672123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang if (rc != NO_ERROR) { 9682123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang ALOGE("%s: incoming request is not valid", __func__); 9692123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang pthread_mutex_unlock(&mMutex); 9702123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang return rc; 9712123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang } 9722123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9732123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang meta = request->settings; 9742123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9752123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang // For first capture request, send capture intent, and 9762123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang // stream on all streams 977d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang if (mFirstRequest) { 9782123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9792123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang if (meta.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 9802123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang int32_t hal_version = CAM_HAL_V3; 9812123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang uint8_t captureIntent = 9822123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang meta.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 9832123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 9842123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 9852123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 9862123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 9872123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang sizeof(hal_version), &hal_version); 9882123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 9892123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang sizeof(captureIntent), &captureIntent); 9902123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, 9912123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang mParameters); 9922123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang } 9932123c5d141214ae0412840fc9931726a33e4fdacShuzhen Wang 994d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 995d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang it != mStreamInfo.end(); it++) { 996d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 997d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang channel->start(); 998d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang } 999d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang } 1000d0282b31d769c3e69100be4443f3adfcdf7178c5Shuzhen Wang 1001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frameNumber = request->frame_number; 100234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy uint32_t streamTypeMask = 0; 10039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 100474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab if (meta.exists(ANDROID_REQUEST_ID)) { 100574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0]; 100674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = request_id; 1007013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Received request with id: %d",__func__, request_id); 100874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else if (mFirstRequest || mCurrentRequestId == -1){ 100974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab ALOGE("%s: Unable to find request id field, \ 101074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab & no previous id available", __func__); 101174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab return NAME_NOT_FOUND; 101274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else { 1013013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Re-using old request id", __func__); 101474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = mCurrentRequestId; 101574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } 101674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 1017d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d", 1018c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, __LINE__, 1019c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->num_output_buffers, 1020c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer, 1021c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang frameNumber); 1022e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // Acquire all request buffers first 10237ee407aa1024789089aad411c372c79423699976Ajay Dudani int blob_request = 0; 1024e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 1025e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 102634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 1027e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang sp<Fence> acquireFence = new Fence(output.acquire_fence); 102866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 102966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 103066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Call function to store local copy of jpeg data for encode params. 10317ee407aa1024789089aad411c372c79423699976Ajay Dudani blob_request = 1; 103266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = getJpegSettings(request->settings); 103366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (rc < 0) { 10340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: failed to get jpeg parameters", __func__); 103566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pthread_mutex_unlock(&mMutex); 103666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 103766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 103866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 103966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1040e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 1041e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != OK) { 1042e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: fence wait failed %d", __func__, rc); 1043e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1044e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 1045e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 104634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy streamTypeMask |= channel->getStreamTypeMask(); 104734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy } 104834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy 104962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = setFrameParameters(request, streamTypeMask); 105034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy if (rc < 0) { 105134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy ALOGE("%s: fail to set frame parameters", __func__); 105234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy pthread_mutex_unlock(&mMutex); 105334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy return rc; 1054e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1055e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 10561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Update pending request list and pending buffers map */ 10571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole PendingRequestInfo pendingRequest; 10581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.frame_number = frameNumber; 10591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.num_buffers = request->num_output_buffers; 106074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab pendingRequest.request_id = request_id; 10617ee407aa1024789089aad411c372c79423699976Ajay Dudani pendingRequest.blob_request = blob_request; 106213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab pendingRequest.input_buffer_present = (request->input_buffer != NULL)? 1 : 0; 106374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 10641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < request->num_output_buffers; i++) { 10651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole RequestedBufferInfo requestedBuf; 10661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.stream = request->output_buffers[i].stream; 10671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.buffer = NULL; 10681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.buffers.push_back(requestedBuf); 10691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(requestedBuf.stream)++; 10711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.push_back(pendingRequest); 10731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 1075e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMetadataChannel->request(NULL, frameNumber); 10769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 10779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 10789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 10799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 10809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 1081c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mm_camera_buf_def_t *pInputBuffer = NULL; 108266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 10839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 10849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 10859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 10869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 10879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 108866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 1089c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3RegularChannel* inputChannel = NULL; 1090c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(request->input_buffer != NULL){ 1091c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang //Try to get the internal format 1092c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel = (QCamera3RegularChannel*) 1093c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->stream->priv; 1094c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(inputChannel == NULL ){ 1095c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: failed to get input channel handle", __func__); 1096c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else { 1097c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer = 1098c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel->getInternalFormatBuffer( 1099c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->buffer); 1100c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("%s: Input buffer dump",__func__); 1101c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("Stream id: %d", pInputBuffer->stream_id); 1102c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("streamtype:%d", pInputBuffer->stream_type); 1103c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("frame len:%d", pInputBuffer->frame_len); 110441da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab ALOGD("Handle:%p", request->input_buffer->buffer); 1105d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //TODO: need to get corresponding metadata and send it to pproc 1106d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1107d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 1108d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->zsl_buf_hdl == request->input_buffer->buffer) { 1109d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab reproc_meta.meta_buf = m->meta_buf; 1110d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab queueMetadata = 1; 1111d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1112d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1113d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1114c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1115c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1116c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang rc = channel->request(output.buffer, frameNumber, mJpegSettings, 1117c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer,(QCamera3Channel*)inputChannel); 1118d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (queueMetadata) { 111941da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(reproc_meta.meta_buf,mMetadataChannel,false); 1120d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 112166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 1122d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: %d, request with buffer %p, frame_number %d", __func__, 1123a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab __LINE__, output.buffer, frameNumber); 1124d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (mIsZslMode && output.stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1125d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1126d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.end(); m++) { 1127d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (uint32_t j = 0; j < request->num_output_buffers; j++) { 1128d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->zsl_buf_hdl == request->output_buffers[j].buffer) { 1129d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mMetadataChannel->bufDone(m->meta_buf); 1130d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(m->meta_buf); 1131d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m = mStoredMetadataList.erase(m); 1132d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1133d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1134d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1135d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1136d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 113766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = channel->request(output.buffer, frameNumber); 113866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 11399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 11409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 11419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 11429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 11431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mFirstRequest = false; 11441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 11459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 11469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 1; 11479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang while (mPendingRequest == 1) { 11485b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_cond_wait(&mRequestCond, &mMutex); 11499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 11509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1151e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 115280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 115380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 115480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 11559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 1156e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : getMetadataVendorTagOps 11579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 1158e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 11599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 11609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 1161e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1162e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1163e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1164e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1165b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps( 1166b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang vendor_tag_query_ops_t* /*ops*/) 1167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Enable locks when we eventually add Vendor Tags */ 1169e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 1170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1171e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1172e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1173e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 1174e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1175e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1176e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1177e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1178e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : dump 1179e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1180e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 1181e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1182e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1183e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1184e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1185e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1186e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1187b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/) 1188e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1189e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /*Enable lock when we implement this function*/ 1190e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 1191e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1192e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1193e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1194e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 1195e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1196e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1197e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1198c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*=========================================================================== 1199c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION : flush 1200c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1201c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION: 1202c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1203c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS : 1204c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1205c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 1206c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN : 1207c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/ 1208c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush() 1209c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{ 1210c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /*Enable lock when we implement this function*/ 1211c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang /* 1212c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang pthread_mutex_lock(&mMutex); 1213c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 1214c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang pthread_mutex_unlock(&mMutex); 1215c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang */ 1216c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return 0; 1217c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang} 12187ee407aa1024789089aad411c372c79423699976Ajay Dudani 1219e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1220e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 1221e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 122233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result 122333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * (streams, as well as metadata) 1224e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1225e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1226e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @metadata : metadata information 122733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. 122833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * NULL if metadata. 12299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 12309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 12319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 12321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf, 1233e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 12349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 12355b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_lock(&mMutex); 1236e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 12371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (metadata_buf) { 12381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer; 123933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int32_t frame_number_valid = *(int32_t *) 124033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata); 1241152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang uint32_t pending_requests = *(uint32_t *)POINTER_OF( 1242152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang CAM_INTF_META_PENDING_REQUESTS, metadata); 124333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang uint32_t frame_number = *(uint32_t *) 124433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata); 12450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole const struct timeval *tv = (const struct timeval *) 12460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata); 12470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC + 12480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole tv->tv_usec * NSEC_PER_USEC; 12490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 12501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!frame_number_valid) { 1251a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: Not a valid frame number, used as SOF only", __func__); 12521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->bufDone(metadata_buf); 12531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole goto done_metadata; 12541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1255a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__, 1256e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang frame_number, capture_time); 12571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 12581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Go through the pending requests info and send shutter/results to frameworks 12591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1260e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i != mPendingRequestsList.end() && i->frame_number <= frame_number;) { 12611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 12621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_notify_msg_t notify_msg; 1263a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number); 12641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 12651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Flush out all entries with less or equal frame numbers. 12661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 1267e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: Make sure shutter timestamp really reflects shutter timestamp. 1268e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //Right now it's the same as metadata timestamp 1269e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 1270e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: When there is metadata drop, how do we derive the timestamp of 1271e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //dropped frames? For now, we fake the dropped timestamp by substracting 1272e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //from the reported timestamp 1273e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang nsecs_t current_capture_time = capture_time - 1274e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang (frame_number - i->frame_number) * NSEC_PER_33MSEC; 1275e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 12761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send shutter notify to frameworks 12771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.type = CAMERA3_MSG_SHUTTER; 12781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.message.shutter.frame_number = i->frame_number; 1279e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang notify_msg.message.shutter.timestamp = current_capture_time; 12801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1281a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__, 1282e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i->frame_number, capture_time); 12831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 12841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send empty metadata with already filled buffers for dropped metadata 12851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // and send valid metadata with already filled buffers for current metadata 12861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i->frame_number < frame_number) { 128799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang CameraMetadata dummyMetadata; 128899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP, 1289e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ¤t_capture_time, 1); 129099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_REQUEST_ID, 129174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab &(i->request_id), 1); 129299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang result.result = dummyMetadata.release(); 12931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 1294e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.result = translateCbMetadataToResultMetadata(metadata, 129574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab current_capture_time, i->request_id); 1296d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (mIsZslMode) { 1297d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int found_metadata = 0; 1298d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //for ZSL case store the metadata buffer and corresp. ZSL handle ptr 1299d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1300d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab j != i->buffers.end(); j++) { 1301d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (j->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1302d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //check if corresp. zsl already exists in the stored metadata list 1303d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator m = mStoredMetadataList.begin(); 1304d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m != mStoredMetadataList.begin(); m++) { 1305d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (m->frame_number == frame_number) { 1306d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m->meta_buf = metadata_buf; 1307d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found_metadata = 1; 1308d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1309d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1310d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1311d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found_metadata) { 1312d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo store_meta_info; 1313d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab store_meta_info.meta_buf = metadata_buf; 1314d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab store_meta_info.frame_number = frame_number; 1315d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mStoredMetadataList.push_back(store_meta_info); 1316d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found_metadata = 1; 1317d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1318d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1319d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1320d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found_metadata) { 132113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab if (!i->input_buffer_present && i->blob_request) { 132213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab //livesnapshot or fallback non-zsl snapshot case 132313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 132413c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab j != i->buffers.end(); j++){ 132513c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab if (j->stream->stream_type == CAMERA3_STREAM_OUTPUT && 132613c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab j->stream->format == HAL_PIXEL_FORMAT_BLOB) { 132741da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true); 132813c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab break; 132913c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 133013c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 133113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } else { 133213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab //return the metadata immediately 133313c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab mMetadataChannel->bufDone(metadata_buf); 133413c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab free(metadata_buf); 133513c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab } 1336d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1337d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else if (!mIsZslMode && i->blob_request) { 13387ee407aa1024789089aad411c372c79423699976Ajay Dudani //If it is a blob request then send the metadata to the picture channel 133941da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mPictureChannel->queueMetadata(metadata_buf,mMetadataChannel,true); 1340d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else { 13417ee407aa1024789089aad411c372c79423699976Ajay Dudani // Return metadata buffer 13427ee407aa1024789089aad411c372c79423699976Ajay Dudani mMetadataChannel->bufDone(metadata_buf); 13437ee407aa1024789089aad411c372c79423699976Ajay Dudani free(metadata_buf); 1344d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1345d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab 13461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result.result) { 13481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: metadata is NULL", __func__); 13491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.frame_number = i->frame_number; 13511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 0; 1352e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.output_buffers = NULL; 13531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1354e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 13551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 13561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers++; 13571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 13601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (result.num_output_buffers > 0) { 13611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_stream_buffer_t *result_buffers = 13621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole new camera3_stream_buffer_t[result.num_output_buffers]; 13631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result_buffers) { 13641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Fatal error: out of memory", __func__); 13651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole size_t result_buffers_idx = 0; 13671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1368e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 13691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 13701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result_buffers[result_buffers_idx++] = *(j->buffer); 13711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free(j->buffer); 137213dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang j->buffer = NULL; 13731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(j->stream)--; 13741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = result_buffers; 13771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 13781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1379a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: meta frame_number = %d, capture_time = %lld", 1380d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 13811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 13821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete[] result_buffers; 13831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 13841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1385d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: meta frame_number = %d, capture_time = %lld", 1386d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 13871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 13881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 13891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // erase the element from the list 13901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i = mPendingRequestsList.erase(i); 13911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 139233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 139333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 13941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata: 13951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole bool max_buffers_dequeued = false; 13961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < mPendingBuffersMap.size(); i++) { 13971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i); 1398e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang uint32_t queued_buffers = mPendingBuffersMap.valueAt(i); 13991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (queued_buffers == stream->max_buffers) { 14001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole max_buffers_dequeued = true; 14011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole break; 14021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1404152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang if (!max_buffers_dequeued && !pending_requests) { 14051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Unblock process_capture_request 14061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequest = 0; 14071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_cond_signal(&mRequestCond); 14081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 14101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // If the frame number doesn't exist in the pending request list, 14111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // directly send the buffer to the frameworks, and update pending buffers map 14121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Otherwise, book-keep the buffer. 14131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1414c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang while (i != mPendingRequestsList.end() && i->frame_number != frame_number){ 14151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i++; 1416c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 14171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i == mPendingRequestsList.end()) { 14181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Verify all pending requests frame_numbers are greater 14191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin(); 1420e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != mPendingRequestsList.end(); j++) { 14211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->frame_number < frame_number) { 14221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: pending frame number %d is smaller than %d", 14231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole __func__, j->frame_number, frame_number); 14241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 14271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.result = NULL; 142833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang result.frame_number = frame_number; 14291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 1; 14301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = buffer; 1431a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: result frame_number = %d, buffer = %p", 1432e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, frame_number, buffer); 14331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(buffer->stream)--; 1434d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (buffer->stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 1435d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int found = 0; 1436d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab for (List<MetadataBufferInfo>::iterator k = mStoredMetadataList.begin(); 1437d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab k != mStoredMetadataList.end(); k++) { 1438d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (k->frame_number == frame_number) { 1439d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab k->zsl_buf_hdl = buffer->buffer; 1440d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab found = 1; 1441d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab break; 1442d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1443d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1444d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!found) { 1445d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab MetadataBufferInfo meta_info; 1446d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab meta_info.frame_number = frame_number; 1447d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab meta_info.zsl_buf_hdl = buffer->buffer; 1448d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mStoredMetadataList.push_back(meta_info); 1449d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1450d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1451e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 145233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } else { 14531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1454e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 14551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->stream == buffer->stream) { 14561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer != NULL) { 14571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: buffer is already set", __func__); 14581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 14591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole j->buffer = (camera3_stream_buffer_t *)malloc( 14601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(camera3_stream_buffer_t)); 14611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole *(j->buffer) = *buffer; 1462a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: cache buffer %p at result frame_number %d", 1463e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, buffer, frame_number); 14641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 14661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1467e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 14689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 14695b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_unlock(&mMutex); 14709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 14719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 14729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 147397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 147497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : translateCbMetadataToResultMetadata 147597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 147697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: 147797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 147897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 147997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @metadata : metadata information from callback 148097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 148197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN : camera_metadata_t* 148297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * metadata in a format specified by fwk 148397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 148497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* 148597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata 148674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab (metadata_buffer_t *metadata, nsecs_t timestamp, 148774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id) 148897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 148997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata camMetadata; 149097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camera_metadata_t* resultMetadata; 149197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 14920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); 149374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1); 149497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 149597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_HISTOGRAM - TODO*/ 149697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*cam_hist_stats_t *histogram = 149797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM, 149897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole metadata);*/ 149997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 150097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*face detection*/ 150197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *) 150297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata); 150397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t numFaces = faceDetectionInfo->num_faces_detected; 150497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceIds[numFaces]; 150597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t faceScores[numFaces]; 150697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceRectangles[numFaces * 4]; 150797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceLandmarks[numFaces * 6]; 150897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int j = 0, k = 0; 150997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < numFaces; i++) { 151097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceIds[i] = faceDetectionInfo->faces[i].face_id; 151197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceScores[i] = faceDetectionInfo->faces[i].score; 151259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(faceDetectionInfo->faces[i].face_boundary, 151397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles+j, -1); 151497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k); 151597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole j+= 4; 151697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole k+= 6; 151797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 151899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang if (numFaces > 0) { 151999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces); 152099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces); 152199b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES, 152297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles, numFaces*4); 152399b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS, 152497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceLandmarks, numFaces*6); 152599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang } 152697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15278867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t *color_correct_mode = 15280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata); 152997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1); 153097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 153197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *ae_precapture_id = 153297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata); 153397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1); 153497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 153597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*aec regions*/ 153697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAeRegions = 153797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata); 153897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t aeRegions[5]; 153959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight); 154097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5); 154113c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab 154213c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab uint8_t *ae_state = 15438bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata); 154413c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1); 154513c48518ed9ba7e67d249841de56e51618e090a0Mansoor Aftab 15460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *focusMode = 15470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata); 154897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1); 154997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 155097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*af regions*/ 155197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAfRegions = 155297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata); 155397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t afRegions[5]; 155459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight); 155597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5); 155697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata); 155897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1); 155997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 156097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *afTriggerId = 156197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata); 156297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1); 156397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalance = 15650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata); 156697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1); 156797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 156897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*awb regions*/ 156997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAwbRegions = 157097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata); 157197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t awbRegions[5]; 157259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight); 157397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5); 157497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalanceState = 15760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata); 157797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1); 157897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata); 158097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_MODE, mode, 1); 158197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1582d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE_MODE, metadata); 158397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1); 158497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashPower = 15860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata); 158797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1); 158897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 158997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *flashFiringTime = 159097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata); 159197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1); 159297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 159397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *ledMode = 159497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata); 159597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/ 159697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 15970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashState = 15980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata); 159997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_STATE, flashState, 1); 160097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *hotPixelMode = 16020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata); 160397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1); 160497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 160597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *lensAperture = 160697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata); 160797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1); 160897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 160997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *filterDensity = 161097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata); 161197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1); 161297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 161397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focalLength = 161497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata); 161597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1); 161697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 161797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusDistance = 161897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata); 161997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1); 162097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 162197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusRange = 162297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata); 162397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1); 162497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *opticalStab = 16260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata); 16270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1); 162897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 162997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *focusState = 163097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata); 163197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */ 163297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *noiseRedMode = 16340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata); 163597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1); 163697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 163797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_SCALER_CROP_REGION - check size*/ 163897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_crop_region_t *hScalerCropRegion =(cam_crop_region_t *) 164097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata); 164171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t scalerCropRegion[4]; 16420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[0] = hScalerCropRegion->left; 16430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[1] = hScalerCropRegion->top; 16440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[2] = hScalerCropRegion->width; 164571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropRegion[3] = hScalerCropRegion->height; 164671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4); 164797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 164897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorExpTime = 164997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata); 16500b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi mMetadataResponse.exposure_time = *sensorExpTime; 165162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: sensorExpTime = %lld", __func__, *sensorExpTime); 165297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1); 165397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 165497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorFameDuration = 165597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata); 165662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: sensorFameDuration = %lld", __func__, *sensorFameDuration); 165797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1); 165897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 165997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *sensorSensitivity = 166097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata); 166162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: sensorSensitivity = %d", __func__, *sensorSensitivity); 16623fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mMetadataResponse.iso_speed = *sensorSensitivity; 166397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1); 166497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *shadingMode = 16660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata); 166797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1); 166897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *faceDetectMode = 16700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata); 16716990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t fwk_faceDetectMode = lookupFwkName(FACEDETECT_MODES_MAP, 16726990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang sizeof(FACEDETECT_MODES_MAP)/sizeof(FACEDETECT_MODES_MAP[0]), 16736990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang *faceDetectMode); 16746990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, &fwk_faceDetectMode, 1); 167597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *histogramMode = 16770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata); 167897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1); 167997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 16800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *sharpnessMapMode = 16810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata); 168297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 168397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole sharpnessMapMode, 1); 168497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 168597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/ 168697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_sharpness_map_t *sharpnessMap = (cam_sharpness_map_t *) 168797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata); 168897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP, 168997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t*)sharpnessMap->sharpness, 169097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT); 169197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1692d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *) 1693d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_LENS_SHADING_MAP, metadata); 1694d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height; 1695d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy int map_width = gCamCapability[mCameraId]->lens_shading_map_size.width; 1696d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP, 1697d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy (float*)lensShadingMap->lens_shading, 1698d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 4*map_width*map_height); 1699d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1700d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*) 1701d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata); 1702d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4); 1703d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1704d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*) 1705d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata); 1706d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM, 1707d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3); 1708d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1709d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*) 1710d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata); 1711d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS, 1712d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy predColorCorrectionGains->gains, 4); 1713d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1714d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*) 1715d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata); 1716d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM, 1717d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3); 1718d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1719d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t *blackLevelLock = (uint8_t*) 1720d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata); 1721d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1); 1722d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1723d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t *sceneFlicker = (uint8_t*) 1724d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy POINTER_OF(CAM_INTF_META_SCENE_FLICKER, metadata); 1725d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1); 1726d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 1727d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 172897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole resultMetadata = camMetadata.release(); 172933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return resultMetadata; 173097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 173197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 173297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 173359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertToRegions 173497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 173597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array 173697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 173797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 173897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @rect : cam_rect_t struct to convert 173997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @region : int32_t destination array 174097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @weight : if we are converting from cam_area_t, weight is valid 174197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * else weight = -1 174297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 174397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 174459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){ 174597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[0] = rect.left; 174697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[1] = rect.top; 174759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[2] = rect.left + rect.width; 174859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[3] = rect.top + rect.height; 174997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (weight > -1) { 175097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[4] = weight; 175197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 175297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 175359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 175459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*=========================================================================== 175559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertFromRegions 175659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 175759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t 175859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 175959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS : 176059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @rect : cam_rect_t struct to convert 176159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @region : int32_t destination array 176259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @weight : if we are converting from cam_area_t, weight is valid 176359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * else weight = -1 176459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 176559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/ 176659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi, 176759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang const camera_metadata_t *settings, 176859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang uint32_t tag){ 176959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang CameraMetadata frame_settings; 177059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang frame_settings = settings; 177159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_min = frame_settings.find(tag).data.i32[0]; 177259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_min = frame_settings.find(tag).data.i32[1]; 177359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_max = frame_settings.find(tag).data.i32[2]; 177459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_max = frame_settings.find(tag).data.i32[3]; 177559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->weight = frame_settings.find(tag).data.i32[4]; 177659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.left = x_min; 177759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.top = y_min; 177859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.width = x_max - x_min; 177959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.height = y_max - y_min; 178059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang} 178159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 178297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 178371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION : resetIfNeededROI 178471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 178571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler 178671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * crop region 178771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 178871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS : 178971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @roi : cam_area_t struct to resize 179071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @scalerCropRegion : cam_crop_region_t region to compare against 179171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 179271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 179371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/ 179471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi, 179571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang const cam_crop_region_t* scalerCropRegion) 179671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{ 179771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_x_max = roi->rect.width + roi->rect.left; 179871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_y_max = roi->rect.height + roi->rect.top; 179971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top; 180071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left; 180171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if ((roi_x_max < scalerCropRegion->left) || 180271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi_y_max < scalerCropRegion->top) || 180371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.left > crop_x_max) || 180471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.top > crop_y_max)){ 180571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return false; 180671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 180771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.left < scalerCropRegion->left) { 180871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.left = scalerCropRegion->left; 180971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 181071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.top < scalerCropRegion->top) { 181171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.top = scalerCropRegion->top; 181271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 181371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_x_max > crop_x_max) { 181471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_x_max = crop_x_max; 181571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 181671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_y_max > crop_y_max) { 181771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_y_max = crop_y_max; 181871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 181971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.width = roi_x_max - roi->rect.left; 182071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.height = roi_y_max - roi->rect.top; 182171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return true; 182271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang} 182371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang 182471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*=========================================================================== 182597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : convertLandmarks 182697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 182797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info 182897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 182997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 183097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @face : cam_rect_t struct to convert 183197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @landmarks : int32_t destination array 183297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 183397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 183497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 183597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks) 183697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 183797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[0] = face.left_eye_center.x; 183897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[1] = face.left_eye_center.y; 183997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[2] = face.right_eye_center.y; 184097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[3] = face.right_eye_center.y; 184197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[4] = face.mouth_center.x; 184297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[5] = face.mouth_center.y; 184397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 184497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 1846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 1848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 1850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 1856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 1857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 1859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 1861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 1862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 1863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 1865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 1866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 1867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 1868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 1869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 1872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (capabilityHeap == NULL) { 1873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: creation of capabilityHeap failed", __func__); 1874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang goto heap_creation_failed; 1875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 1877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 1878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 1879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 1880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 1881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 1884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 1885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 1886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 1887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 1888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 1891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 1892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1893625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 1895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 1896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 1898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 1901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 1902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 1903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 1906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 1908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 1910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 1911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 1912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 1913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 1914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 1915e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete capabilityHeap; 1916e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed: 1917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 1918625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 1919625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 1920625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1922625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1923625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : initParameters 1925662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1926662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters 1927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1928662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1929662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1930662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1931662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 1932662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1934662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters() 1935662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 1937662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Allocate Set Param Buffer 1939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = new QCamera3HeapMemory(); 1940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 1941662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc != OK) { 1942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = NO_MEMORY; 1943662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("Failed to allocate SETPARM Heap memory"); 1944662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1945662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1946662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1947662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1948662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1949662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Map memory for parameters buffer 1950662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 1951662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole CAM_MAPPING_BUF_TYPE_PARM_BUF, 1952662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->getFd(0), 1953662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(parm_buffer_t)); 1954662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc < 0) { 1955662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:failed to map SETPARM buffer",__func__); 1956662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = FAILED_TRANSACTION; 1957662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->deallocate(); 1958662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1959662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1960662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1961662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1962662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1963662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0); 1964662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 196833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION : deinitParameters 196933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 197033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters 197133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 197233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS : 197333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 197433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN : NONE 197533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/ 197633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters() 197733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{ 197833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 197933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF); 198033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 198133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap->deallocate(); 198233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang delete mParamHeap; 198333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap = NULL; 198433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 198533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters = NULL; 198633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang} 198733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 198833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*=========================================================================== 19890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION : calcMaxJpegSize 19900a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 19910a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId 19920a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 19930a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS : 19940a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 19950a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN : max_jpeg_size 19960a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/ 19970a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize() 19980a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{ 19990a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int32_t max_jpeg_size = 0; 20000a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int temp_width, temp_height; 20010a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 20020a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width; 20030a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height; 20040a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab if (temp_width * temp_height > max_jpeg_size ) { 20050a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = temp_width * temp_height; 20060a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 20070a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 20080a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 20090a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab return max_jpeg_size; 20100a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab} 20110a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab 20120a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*=========================================================================== 2013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 2014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 2016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2020625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2021625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 2022625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 2023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 2025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 202797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata staticInfo; 2028c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 2029c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang /* android.info: hardware level */ 2030c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL; 2031c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, 2032c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &supportedHardwareLevel, 1); 2033c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 2034662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK; 2035662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 3 only*/ 20362dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 20372dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); */ 20382dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2039e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang /*hard coded for now but this should come from sensor*/ 2040e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang float min_focus_distance; 2041e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if(facingBack){ 2042e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 10; 2043e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2044e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 0; 2045e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 20472dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &min_focus_distance, 1); 2048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 2050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 2051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2052c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*should be using focal lengths but sensor doesn't provide that info now*/ 2053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 2054c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &gCamCapability[cameraId]->focal_length, 2055c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1); 2056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 2058625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 2059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 2060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 2062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 2063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 2064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 2067c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)gCamCapability[cameraId]->optical_stab_modes, 2068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 2069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 207080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 207180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 207280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 207380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 207447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 207580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 207680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 207780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 207880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 2079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 208047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 20810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->geo_correction_map_size.height}; 208280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 208380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 208480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 208580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 208680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 208780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 2088c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float)); 208980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 209080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 209180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 209280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 209380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 209480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 209580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 209680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 209780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 209880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 209980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 210080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 2101c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1); 210280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 210347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 210480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 210580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 210680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 210780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 210822817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t active_array_size[] = {0, 0, 210922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala gCamCapability[cameraId]->active_array_size.width, 211080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 211180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 211222817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala active_array_size, 4); 211380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 211480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 211580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 2116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 211780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 211880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 211980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 212080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 212180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 212280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 212380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 212480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 212580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 212680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 21276990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang (int*)&gCamCapability[cameraId]->max_num_roi, 1); 212880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 212980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 213080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 213180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 213280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 213380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 213480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 213547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 213680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 213780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 213880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 213980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 214080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 214180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 214280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 214380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 214480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 214580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 214680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 214780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 214880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 214922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888, 215022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB}; 215122817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t); 2152662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 2153662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats, 21548867984d33ed870071109a4500402dddbc85c048Shuzhen Wang scalar_formats_count); 2155662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 215647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_processed_sizes[CAM_FORMAT_MAX * 2]; 215700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang makeTable(gCamCapability[cameraId]->picture_sizes_tbl, 215800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt, 2159662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes); 2160662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2161662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes, 216200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2); 216300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 2164e936796df0426c326d043c2359c149024526f4bcShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, 216500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 216600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 21670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 216847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_fps_ranges[MAX_SIZES_CNT * 2]; 21690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl, 21700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->fps_ranges_tbl_cnt, 21710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole available_fps_ranges); 2172c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2173c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) ); 2174c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 217547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang camera_metadata_rational exposureCompensationStep = { 2176c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.numerator, 2177c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.denominator}; 2178c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 2179c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &exposureCompensationStep, 1); 2180c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2181c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*TO DO*/ 218247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF}; 2183c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 2184c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableVstabModes, sizeof(availableVstabModes)); 2185c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2186b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang /*HAL 1 and HAL 3 common*/ 21879443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab float maxZoom = 4; 2188c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 2189c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &maxZoom, 1); 2190c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 219147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max3aRegions = 1; 2192c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_MAX_REGIONS, 2193c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &max3aRegions, 1); 2194c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 219547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableFaceDetectModes[] = { 21966990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_OFF, 21976990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_FULL }; 2198c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 2199c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableFaceDetectModes, 2200c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(availableFaceDetectModes)); 2201c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 220247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width, 2203662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->raw_dim.height}; 2204662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 2205662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole raw_size, 2206662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(raw_size)/sizeof(uint32_t)); 2207662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 220847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 220980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 221080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 221180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 221280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 221380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 2214662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint8_t lensFacing = (facingBack) ? 221580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 221680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 2217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2218662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 221900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang available_processed_sizes, 2220c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2)); 2221c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 2222c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 222308ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab available_thumbnail_sizes, 222408ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab sizeof(available_thumbnail_sizes)/sizeof(int32_t)); 2225662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 222647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max_jpeg_size = 0; 222797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int temp_width, temp_height; 222897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 222997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width; 223097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height; 223197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (temp_width * temp_height > max_jpeg_size ) { 223297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = temp_width * temp_height; 223397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 223497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 223597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 223697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole staticInfo.update(ANDROID_JPEG_MAX_SIZE, 223797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole &max_jpeg_size, 1); 223897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 223947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_effects[CAM_EFFECT_MODE_MAX]; 22400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t size = 0; 2241662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) { 22420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(EFFECT_MODES_MAP, 2243b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]), 22440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_effects[i]); 22450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 22460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_effects[size] = (uint8_t)val; 22470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 22480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2249662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2250662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 2251662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_effects, 22520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2253662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 225447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX]; 2255e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t supported_indexes[CAM_SCENE_MODE_MAX]; 22562dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang int32_t supported_scene_modes_cnt = 0; 2257662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) { 22580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(SCENE_MODES_MAP, 2259b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 22600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_scene_modes[i]); 22610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 2262e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val; 2263e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_indexes[supported_scene_modes_cnt] = i; 22642dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt++; 22650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2266662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2267e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2268662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 2269662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_scene_modes, 22702dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt); 2271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 227247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3]; 2273e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides, 2274e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt, 2275e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 22769443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supported_indexes, 22779443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab cameraId); 2278e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 2279e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 2280e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt*3); 2281e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 228247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX]; 22830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2284662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) { 22850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(ANTIBANDING_MODES_MAP, 2286b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 2287b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[cameraId]->supported_antibandings[i]); 22880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 22890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_antibanding_modes[size] = (uint8_t)val; 22900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 22910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 22920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2293662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2294662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 2295662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_antibanding_modes, 22960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2297662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 229847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX]; 22990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2300662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) { 23010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FOCUS_MODES_MAP, 2302b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 23030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_focus_modes[i]); 23040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 23050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_af_modes[size] = (uint8_t)val; 23060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 23070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2308662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2309662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 2310662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_af_modes, 23110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2312662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 231347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_awb_modes[CAM_WB_MODE_MAX]; 23140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) { 23160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP, 2317b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 23180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_white_balances[i]); 23190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 23200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_awb_modes[size] = (uint8_t)val; 23210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 23220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2323662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2324662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 2325662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_awb_modes, 23260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2327662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2328a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX]; 2329a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++) 2330a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i]; 2331a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava 2332a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava staticInfo.update(ANDROID_FLASH_FIRING_POWER, 2333a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava available_flash_levels, 2334a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava gCamCapability[cameraId]->supported_flash_firing_level_cnt); 2335a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava 2336662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 233700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang uint8_t flashAvailable = gCamCapability[cameraId]->flash_available; 2338e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE, 2339e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang &flashAvailable, 1); 2340e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2341e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t avail_ae_modes[5]; 2342e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size = 0; 2343e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) { 2344e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i]; 2345e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size++; 2346e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2347e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (flashAvailable) { 2348e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; 2349e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; 2350e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; 2351e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2352662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 2353662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_ae_modes, 2354e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size); 2355ea44a483c0e98200c058a85ea339457616516847Zhijun He 2356e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t sensitivity_range[2]; 2357e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity; 2358e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity; 2359ea44a483c0e98200c058a85ea339457616516847Zhijun He staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, 2360ea44a483c0e98200c058a85ea339457616516847Zhijun He sensitivity_range, 2361ea44a483c0e98200c058a85ea339457616516847Zhijun He sizeof(sensitivity_range) / sizeof(int32_t)); 23622dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 236373c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, 236473c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy &gCamCapability[cameraId]->max_analog_sensitivity, 236500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 1); 236600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 236773c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 2368e936796df0426c326d043c2359c149024526f4bcShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 2369e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 237073c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy 237100f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle; 237200f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang staticInfo.update(ANDROID_SENSOR_ORIENTATION, 237300f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang &sensor_orientation, 237400f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 1); 237500f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 237600f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang int32_t max_output_streams[3] = {1, 3, 1}; 237700f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, 237800f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang max_output_streams, 237900f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 3); 238000f8676421afc5452383b3eb17caf3c7167ee20aShuzhen Wang 2381b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang gStaticMetadata[cameraId] = staticInfo.release(); 2382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2386662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : makeTable 2387662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2388662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes 2389662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2390662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2391662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2392662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2393662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2394662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size, 2395662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t* sizeTable) 2396662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2397662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int j = 0; 2398662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < size; i++) { 2399662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j] = dimTable[i].width; 2400662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j+1] = dimTable[i].height; 2401662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole j+=2; 2402662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2403662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 24040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*=========================================================================== 24060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : makeFPSTable 24070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 24080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges 24090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 24100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS : 24110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 24120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/ 24130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size, 2414c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang int32_t* fpsRangesTable) 24150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{ 24160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int j = 0; 24170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < size; i++) { 2418c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps; 2419c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps; 24200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole j+=2; 24210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole} 24232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 24242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*=========================================================================== 24252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION : makeOverridesList 24262dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24272dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides 24282dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24292dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS : 24302dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24312dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 24322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/ 24332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable, 2434e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t size, uint8_t* overridesList, 24359443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t* supported_indexes, 24369443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int camera_id) 24372dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{ 24382dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*daemon will give a list of overrides for all scene modes. 24392dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang However we should send the fwk only the overrides for the scene modes 24402dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported by the framework*/ 24419443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int j = 0, index = 0, supt = 0; 24429443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t focus_override; 24432dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang for (int i = 0; i < size; i++) { 24449443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 0; 2445e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang index = supported_indexes[i]; 2446e310738e63535838ed4659a55d540b75abc84c19Ajay Dudani overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON; 24479443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP, 24489443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 24499443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesTable[index].awb_mode); 24509443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override = (uint8_t)overridesTable[index].af_mode; 24519443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) { 24529443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) { 24539443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 1; 24549443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab break; 24559443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 24569443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 24579443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (supt) { 24589443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP, 24599443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 24609443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override); 24619443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } else { 24629443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF; 24639443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 24642dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang j+=3; 24652dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang } 24662dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang} 24672dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2468662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2469662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : getPreviewHalPixelFormat 2470662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2471662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework 2472662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2473662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend 2474662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2475662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN : format recognized by framework 2476662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2478662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format) 2479662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2480662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t halPixelFormat; 2481662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2482662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole switch (format) { 2483662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV12: 2484662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; 2485662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2486662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21: 2487662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2488662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2489662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21_ADRENO: 2490662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO; 2491662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2492662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_YV12: 2493662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YV12; 2494662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2495662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV16: 2496662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV61: 2497662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole default: 2498662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2499662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2500662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2501662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return halPixelFormat; 2502662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2503662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2504662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 25053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION : getSensorSensitivity 25063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 25073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value 25083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 25093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor 25103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 25113fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN : sensitivity supported by sensor 25123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 25133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/ 25143fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode) 25153fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{ 25163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang int32_t sensitivity; 25173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 25183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang switch (iso_mode) { 25193fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_100: 25203fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 100; 25213fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25223fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_200: 25233fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 200; 25243fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25253fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_400: 25263fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 400; 25273fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25283fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_800: 25293fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 800; 25303fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25313fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_1600: 25323fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 1600; 25333fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25343fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang default: 25353fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = -1; 25363fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 25373fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 25383fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang return sensitivity; 25393fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang} 25403fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 25413fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 25423fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*=========================================================================== 2543662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : AddSetParmEntryToBatch 2544662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2545662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch 2546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2547662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2548662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @p_table : ptr to parameter buffer 2549662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramType : parameter type 2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramLength : length of parameter value 2551662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramValue : ptr to parameter value 2552662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2553662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2554662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 2555662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2556662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2557662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table, 2558662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole cam_intf_parm_type_t paramType, 2559662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint32_t paramLength, 2560662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole void *paramValue) 2561662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2562662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int position = paramType; 2563662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int current, next; 2564662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2565662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2566662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Code to take care of linking next flags * 2567662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2568662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_FIRST_PARAM_ID(p_table); 2569662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position == current){ 2570662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //DO NOTHING 2571662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else if (position < current){ 2572662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, current); 2573662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_FIRST_PARAM_ID(p_table, position); 2574662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 2575662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /* Search for the position in the linked list where we need to slot in*/ 2576662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole while (position > GET_NEXT_PARAM_ID(current, p_table)) 2577662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_NEXT_PARAM_ID(current, p_table); 2578662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2579662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*If node already exists no need to alter linking*/ 2580662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position != GET_NEXT_PARAM_ID(current, p_table)) { 2581662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole next = GET_NEXT_PARAM_ID(current, p_table); 2582662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(current, p_table, position); 2583662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, next); 2584662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2585662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2586662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2587662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2588662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Copy contents into entry * 2589662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2590662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2591662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (paramLength > sizeof(parm_type_t)) { 2592662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:Size of input larger than max entry size",__func__); 2593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2594662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2595662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength); 2596662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NO_ERROR; 2597662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2598662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2599662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2600662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupFwkName 2601662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2602662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2603662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2604662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2605662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2606662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2607662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2608662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @hal_name : name of the hal_parm to map 2609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int type of status 2611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * fwk_name -- success 2612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[], 2615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int hal_name) 2616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2618d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (int i = 0; i < len; i++) { 2619d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang if (arr[i].hal_name == hal_name) 2620d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return arr[i].fwk_name; 2621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2622d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 2623d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* Not able to find matching framework type is not necessarily 2624d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * an error case. This happens when mm-camera supports more attributes 2625d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * than the frameworks do */ 2626d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Cannot find matching framework type", __func__); 2627d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return NAME_NOT_FOUND; 2628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2629662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2630662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupHalName 2632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2635662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2636662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2637662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2638662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2639662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @fwk_name : name of the hal_parm to map 2640662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2641662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2642662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * hal_name -- success 2643662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2644662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[], 2646662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int fwk_name) 2647662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2648662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 2649662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].fwk_name == fwk_name) 2650662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].hal_name; 2651662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 26520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Cannot find matching hal type", __func__); 2653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NAME_NOT_FOUND; 2654662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2655662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2656662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 2658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 2660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 2664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 2667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 2668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 2670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 2671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 2673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 2675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 2676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 2678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2682b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang if (NULL == gStaticMetadata[cameraId]) { 2683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 2684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 2690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 2691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 2692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 2695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 2696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 2700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 2701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 2706c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang info->device_version = CAMERA_DEVICE_API_VERSION_3_0; 2707b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang info->static_camera_characteristics = gStaticMetadata[cameraId]; 2708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 2714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 2716625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 2718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 2721625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 2722625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 272497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type) 2725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 2727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 2729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 2733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 273497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata settings; 2735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 2736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 2737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 2738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 2740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 2742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 2743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 2744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 2745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 2747625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 2748625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2749625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 2750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 2751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 2753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 2754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 2756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 2757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 2760625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2761625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2762625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 2763625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 27649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 27659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 2766625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2767625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 2768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 2769625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2770625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 2771625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 2772625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2773625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 2774625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 2775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 2777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 2778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 2780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 2781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2782625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 2783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 2784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2785e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t focusMode; 2786e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) { 2787e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to auto", __func__); 2788e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_AUTO; 2789e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2790e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to off", __func__); 2791e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_OFF; 2792e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 27932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1); 27942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 27952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; 27962dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 27972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 2799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 2800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 2801625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2802a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4; 2803a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava settings.update(ANDROID_FLASH_FIRING_POWER, 2804a3af5e6860330df6e2ed83a4d912ea268893a52dVineeta Srivastava &flashFiringLevel, 1); 2805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 280747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_aperture = gCamCapability[mCameraId]->apertures[0]; 2808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 2809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2810b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang if (gCamCapability[mCameraId]->filter_densities_count) { 281147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 2812b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 2813b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[mCameraId]->filter_densities_count); 2814b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang } 2815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 28169a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang float default_focal_length = gCamCapability[mCameraId]->focal_length; 28179a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 2818625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 281962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang /* frame duration */ 282062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int64_t default_frame_duration = NSEC_PER_33MSEC; 282162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang settings.update(ANDROID_SENSOR_FRAME_DURATION, &default_frame_duration, 1); 282262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 282362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang /* sensitivity */ 282462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int32_t default_sensitivity = 100; 282562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1); 282662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang 2827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 2828e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2829e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 283480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 283580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 283680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 283780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 283880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 283980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 284062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * @request : request that needs to be serviced 284134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * @streamTypeMask : bit mask of stream types on which buffers are requested 284280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 284380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 284480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 284580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 284662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(camera3_capture_request_t *request, 284762442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang uint32_t streamTypeMask) 284880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 284980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 285080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 285162442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (request->settings == NULL && mFirstRequest) { 285280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 285380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 2854662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 285533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2856b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 2857b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang 2858b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 285933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 286062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 2861b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(hal_version), &hal_version); 286262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if (rc < 0) { 286362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGE("%s: Failed to set hal version in the parameters", __func__); 286462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang return BAD_VALUE; 286562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang } 286633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2867662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*we need to update the frame number in the parameters*/ 2868662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 286962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang sizeof(request->frame_number), &(request->frame_number)); 2870662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (rc < 0) { 2871662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s: Failed to set the frame number in the parameters", __func__); 2872662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2873662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 28740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 287534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy /* Update stream id mask where buffers are requested */ 287634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK, 287734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy sizeof(streamTypeMask), &streamTypeMask); 287834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy if (rc < 0) { 287934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy ALOGE("%s: Failed to set stream type mask in the parameters", __func__); 288034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy return BAD_VALUE; 288134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy } 288234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy 288362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang if(request->settings != NULL){ 288462442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang rc = translateMetadataToParameters(request); 288580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 288680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 2887662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 288880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 288980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 289080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 289180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 289280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 289380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 289480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 289580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 289680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 289780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 289862442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang * @request : request sent from framework 289980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 290080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 290180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 290280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 290380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 290480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 290562442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang (const camera3_capture_request_t *request) 290680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 2907662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 290897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata frame_settings; 290962442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang frame_settings = request->settings; 29100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) { 29120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t antibandingMode = 29130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0]; 29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING, 29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(antibandingMode), &antibandingMode); 29160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 291797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 291853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 2919e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t expCompensation = frame_settings.find( 2920e936796df0426c326d043c2359c149024526f4bcShuzhen Wang ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 2921fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min) 2922fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_compensation_min; 2923fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max) 2924fb0c2e83e497bb2a5980b6e53f14ce9f3bb51209Shuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_compensation_max; 292553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION, 292653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab sizeof(expCompensation), &expCompensation); 292753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 292853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab 29290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) { 29300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0]; 29310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK, 29320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeLock), &aeLock); 29330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) { 29350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_fps_range_t fps_range; 29360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.min_fps = 29370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 29380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.max_fps = 29399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1]; 29400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE, 29410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(fps_range), &fps_range); 29420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 294397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 29442b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang float focalDistance = -1.0; 29452b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) { 29462b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0]; 29472b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 29482b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang CAM_INTF_META_LENS_FOCUS_DISTANCE, 29492b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang sizeof(focalDistance), &focalDistance); 29502b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } 29512b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang 29520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) { 29532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang uint8_t fwk_focusMode = 29540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0]; 29552b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang uint8_t focusMode; 29562b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) { 29572b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focusMode = CAM_FOCUS_MODE_INFINITY; 29582b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } else{ 29592b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focusMode = lookupHalName(FOCUS_MODES_MAP, 29602b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang sizeof(FOCUS_MODES_MAP), 29612b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang fwk_focusMode); 29622b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } 29630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE, 29640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focusMode), &focusMode); 29650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 29670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) { 29680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t awbLock = 29690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0]; 29700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK, 29710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(awbLock), &awbLock); 29720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) { 29750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_whiteLevel = 29760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0]; 29770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP, 29780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(WHITE_BALANCE_MODES_MAP), 29790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_whiteLevel); 29800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE, 29810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(whiteLevel), &whiteLevel); 29820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) { 29850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_effectMode = 29860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0]; 29870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP, 29880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(EFFECT_MODES_MAP), 29890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_effectMode); 29900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT, 29910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(effectMode), &effectMode); 29920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 29950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_aeMode = 29960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 2997e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t aeMode; 2998e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t redeye; 29996356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani 3000e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) { 3001e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_OFF; 3002e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 3003e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_ON; 3004e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 3005e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 3006e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 1; 3007e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 3008e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 0; 3009e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 30106356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani 3011e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP, 3012e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(AE_FLASH_MODE_MAP), 3013f7d51831acde505c8cda8e60ab651b113326c6b7Shuzhen Wang fwk_aeMode); 30140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE, 30150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeMode), &aeMode); 3016e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 3017e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(flashMode), &flashMode); 3018e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION, 3019e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(redeye), &redeye); 30200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) { 30230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t colorCorrectMode = 30240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0]; 30250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = 30260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE, 30270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(colorCorrectMode), &colorCorrectMode); 30280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3029d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3030d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) { 3031d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_gains_t colorCorrectGains; 3032d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int i = 0; i < 4; i++) { 3033d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy colorCorrectGains.gains[i] = 3034d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i]; 3035d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3036d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = 3037d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_GAINS, 3038d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(colorCorrectGains), &colorCorrectGains); 3039d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3040d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3041d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) { 3042d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_color_correct_matrix_t colorCorrectTransform; 3043d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_rational_type_t transform_elem; 3044d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy int num = 0; 3045d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int i = 0; i < 3; i++) { 3046d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 3; j++) { 3047d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy transform_elem.numerator = 3048d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator; 3049d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy transform_elem.denominator = 3050d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator; 3051d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy colorCorrectTransform.transform_matrix[i][j] = transform_elem; 3052d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy num++; 3053d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3054d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3055d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = 3056d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_TRANSFORM, 3057d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(colorCorrectTransform), &colorCorrectTransform); 3058d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3059d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3060e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang cam_trigger_t aecTrigger; 3061e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE; 3062e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger_id = -1; 30632dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&& 30642dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) { 30652dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger = 30660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0]; 30672dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger_id = 30682dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0]; 30690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, 30711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(aecTrigger), &aecTrigger); 30720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30732dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*af_trigger must come with a trigger id*/ 30742dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) && 30752dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) { 30762dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang cam_trigger_t af_trigger; 30772dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger = 30780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0]; 30792dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger_id = 30802dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0]; 30810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 30822dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger); 30830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_MODE)) { 30860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0]; 30870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE, 30880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(metaMode), &metaMode); 30899443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) { 30909443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0]; 30919443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP, 30929443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 30939443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab fwk_sceneMode); 30949443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 3095827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab sizeof(sceneMode), &sceneMode); 3096827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab } else if (metaMode == ANDROID_CONTROL_MODE_OFF) { 3097827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 3098827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 3099827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab sizeof(sceneMode), &sceneMode); 3100827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) { 3101827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 3102827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 31039443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(sceneMode), &sceneMode); 31049443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 31050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) { 31080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t demosaic = 31090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0]; 31100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC, 31110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(demosaic), &demosaic); 31120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_MODE)) { 31150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 3116d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE_MODE, 31170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(edgeMode), &edgeMode); 31180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) { 31210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t edgeStrength = 31220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0]; 31230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 31240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength); 31250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 3127e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (frame_settings.exists(ANDROID_FLASH_MODE)) { 31286356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani int32_t respectFlashMode = 1; 31296356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 31306356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t fwk_aeMode = 31316356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 31326356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) { 31336356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani respectFlashMode = 0; 31346356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: AE Mode controls flash, ignore android.flash.mode", 31356356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani __func__); 31366356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 31376356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 31386356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (respectFlashMode) { 31396356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t flashMode = 31406356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_FLASH_MODE).data.u8[0]; 31416356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP, 31426356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(FLASH_MODES_MAP), 31436356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode); 31446356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: flash mode after mapping %d", __func__, flashMode); 31456356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani // To check: CAM_INTF_META_FLASH_MODE usage 31466356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 31476356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(flashMode), &flashMode); 31486356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 3149e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 3150e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 31510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) { 31520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t flashPower = 31530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0]; 31540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER, 31550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(flashPower), &flashPower); 31560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) { 31590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t flashFiringTime = 31600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0]; 31610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 31620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime); 31630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) { 31660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t geometricMode = 31670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0]; 31680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE, 31690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricMode), &geometricMode); 31700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) { 31738867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t geometricStrength = 31740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0]; 31750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 31760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_GEOMETRIC_STRENGTH, 31770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricStrength), &geometricStrength); 31780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) { 31810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t hotPixelMode = 31820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0]; 31830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE, 31840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(hotPixelMode), &hotPixelMode); 31850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_APERTURE)) { 31880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float lensAperture = 31890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find( ANDROID_LENS_APERTURE).data.f[0]; 31900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE, 31910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(lensAperture), &lensAperture); 31920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 31940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) { 31950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float filterDensity = 31960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0]; 31970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY, 31980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(filterDensity), &filterDensity); 31990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 32020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float focalLength = 32030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 32040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_FOCAL_LENGTH, 32060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focalLength), &focalLength); 32070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) { 32100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t optStabMode = 32110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0]; 32128867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 32130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_OPT_STAB_MODE, 32140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(optStabMode), &optStabMode); 32150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) { 32180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedMode = 32190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]; 32208867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 32210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_MODE, 32220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedMode), &noiseRedMode); 32230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) { 32260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedStrength = 32270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0]; 32288867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 32290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_STRENGTH, 32300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedStrength), &noiseRedStrength); 32310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 323371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang cam_crop_region_t scalerCropRegion; 323471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool scalerCropSet = false; 32350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) { 32360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.left = 32370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0]; 32380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.top = 32390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1]; 32400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.width = 32410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2]; 324247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang scalerCropRegion.height = 324347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3]; 32440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SCALER_CROP_REGION, 32460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(scalerCropRegion), &scalerCropRegion); 324771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropSet = true; 32480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { 32510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorExpTime = 32520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0]; 325362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: setting sensorExpTime %lld", __func__, sensorExpTime); 32540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_EXPOSURE_TIME, 32560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorExpTime), &sensorExpTime); 32570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) { 32600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorFrameDuration = 32610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0]; 326262442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang int64_t minFrameDuration = getMinFrameDuration(request); 326362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang sensorFrameDuration = MAX(sensorFrameDuration, minFrameDuration); 3264e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration) 3265e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration; 326662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: clamp sensorFrameDuration to %lld", __func__, sensorFrameDuration); 32670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_FRAME_DURATION, 32690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorFrameDuration), &sensorFrameDuration); 32700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 32730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t sensorSensitivity = 32740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 3275e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity < 3276e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity) 3277e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 3278e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity; 3279e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity > 3280e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity) 3281e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 3282e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity; 328362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang ALOGV("%s: clamp sensorSensitivity to %d", __func__, sensorSensitivity); 32840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 32850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_SENSITIVITY, 32860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorSensitivity), &sensorSensitivity); 32870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_MODE)) { 32900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t shadingMode = 32910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_MODE).data.u8[0]; 32920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE, 32930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingMode), &shadingMode); 32940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 32950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 32960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) { 32970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t shadingStrength = 32980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0]; 32990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH, 33000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingStrength), &shadingStrength); 33010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) { 33046990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t fwk_facedetectMode = 33050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0]; 33066990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang uint8_t facedetectMode = 33076990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang lookupHalName(FACEDETECT_MODES_MAP, 33086990dc70b744c1fa9eb3d2d7eb27bcc89857746eShuzhen Wang sizeof(FACEDETECT_MODES_MAP), fwk_facedetectMode); 33090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 33100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_FACEDETECT_MODE, 33110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(facedetectMode), &facedetectMode); 33120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) { 33150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t histogramMode = 33160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0]; 33170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 33180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_HISTOGRAM_MODE, 33190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(histogramMode), &histogramMode); 33200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) { 33230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t sharpnessMapMode = 33240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0]; 33250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 33260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, 33270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sharpnessMapMode), &sharpnessMapMode); 33280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 33290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_TONEMAP_MODE)) { 33310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t tonemapMode = 33320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0]; 33330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 33340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_TONEMAP_MODE, 33350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(tonemapMode), &tonemapMode); 33360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3337e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* Tonemap curve channels ch0 = G, ch 1 = B, ch 2 = R */ 3338e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /*All tonemap channels will have the same number of points*/ 3339e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN) && 3340e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE) && 3341e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) { 3342e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_rgb_tonemap_curves tonemapCurves; 3343e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.tonemap_points_cnt = frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).count/2; 3344e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3345e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch0 = G*/ 3346e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang int point = 0; 3347e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_tonemap_curve_t tonemapCurveGreen; 3348e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt ; i++) { 3349d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3350e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurveGreen.tonemap_points[i][j] = 3351e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point]; 3352d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3353d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3354d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3355e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[0] = tonemapCurveGreen; 3356e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3357e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch 1 = B */ 3358e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang point = 0; 3359e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang cam_tonemap_curve_t tonemapCurveBlue; 3360e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 3361d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3362e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurveBlue.tonemap_points[i][j] = 3363e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point]; 3364d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3365d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3366d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3367e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[1] = tonemapCurveBlue; 3368e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3369e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang /* ch 2 = R */ 3370e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang point = 0; 3371d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy cam_tonemap_curve_t tonemapCurveRed; 3372e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang for (int i = 0; i < tonemapCurves.tonemap_points_cnt; i++) { 3373d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy for (int j = 0; j < 2; j++) { 3374d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy tonemapCurveRed.tonemap_points[i][j] = 3375d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point]; 3376d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy point++; 3377d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3378d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3379e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang tonemapCurves.curves[2] = tonemapCurveRed; 3380e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang 3381d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, 3382e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang CAM_INTF_META_TONEMAP_CURVES, 3383e2f4853167052a8f9c3aa42daf56d88cfa9090e3Shuzhen Wang sizeof(tonemapCurves), &tonemapCurves); 3384d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 33850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 33860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 33870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t captureIntent = 33880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 33890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 33900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(captureIntent), &captureIntent); 33910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 3392662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3393d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) { 3394d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t blackLevelLock = 3395d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0]; 3396d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_BLACK_LEVEL_LOCK, 3397d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(blackLevelLock), &blackLevelLock); 3398d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3399d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 3400d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) { 3401d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy uint8_t lensShadingMapMode = 3402d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0]; 3403d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE, 3404d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy sizeof(lensShadingMapMode), &lensShadingMapMode); 3405d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy } 3406d18b71ed9389d1b7ccdb9e6caca12ef78e260622Nagesh Subba Reddy 340759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) { 340859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 340971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 341062442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AE_REGIONS); 341171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 341271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 341371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 341471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 341571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI, 341671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 341771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 341859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 341959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 342059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) { 342159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 342271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 342362442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AF_REGIONS); 342471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 342571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 342671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 342771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 342871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI, 342971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 343071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 343159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 343259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 343359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) { 343459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 343571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 343662442157951e325f2e7b9d81e669992e8ba5564aShuzhen Wang convertFromRegions(&roi, request->settings, ANDROID_CONTROL_AWB_REGIONS); 343771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 343871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 343971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 344071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 344171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS, 344271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 344371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 344459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 3445662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 3446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 3447662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3448662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 34490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : getJpegSettings 3450662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 34510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL 3452662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3453662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3454662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 3455662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @settings : frame settings information from framework 3456662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3457662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3458662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : success: NO_ERROR 3459662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * failure: 3460662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 3461662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings 3462662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (const camera_metadata_t *settings) 3463662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 3464662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (mJpegSettings) { 34659a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_timestamp) { 34669a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_timestamp); 34679a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 34689a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 34699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_coordinates) { 34709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 34719a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_coordinates[i]); 34729a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 34739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 34749a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 3475662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole free(mJpegSettings); 3476662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = NULL; 3477662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 3478662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t)); 347997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata jpeg_settings; 3480662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings = settings; 3481662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 34820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) { 34830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 34840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0]; 34850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 34860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 0; 34870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) { 34890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_quality = 34900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0]; 34910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 34921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mJpegSettings->jpeg_quality = 85; 34930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 34940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) { 34950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.width = 34960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0]; 34970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.height = 34980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1]; 34990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 350008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.width = 0; 350108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.height = 0; 35020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) { 35040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < 3; i++) { 35059a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*)); 35069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_coordinates[i]) = 35070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i]; 35080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else{ 35109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 35119a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 35123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 35130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35149a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 35150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { 35169a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*)); 35179a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_timestamp) = 35180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0]; 35199a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 35209a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 35210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 35230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { 35249a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count; 35259a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < len; i++) { 35269a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[i] = 35279a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i]; 35289a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 35299a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_processing_method[len-1] != '\0') { 35309a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[len] = '\0'; 35319a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 35329a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 35339a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[0] = '\0'; 35340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35353fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 35360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 35370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->sensor_sensitivity = 35380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 35393fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else { 35403fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed; 35410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 35429a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 35430b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi mJpegSettings->sensor_exposure_time = mMetadataResponse.exposure_time; 35440b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi 35450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 35460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->lens_focal_length = 35470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 35480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 354953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 355053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_compensation = 355153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 355253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 355353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step; 35540a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab mJpegSettings->max_jpeg_size = calcMaxJpegSize(); 35557ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->is_jpeg_format = true; 35567ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask; 355780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 355880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 355980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 356080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 3561e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 3562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 3564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 3567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 3568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 3569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 3571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 35721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata, 3573e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, 3574e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frame_number, void *userdata) 3575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 3577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 3578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 3579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3582e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->captureResultCb(metadata, buffer, frame_number); 3583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 35867ee407aa1024789089aad411c372c79423699976Ajay Dudani 3587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 3589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 3591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3593625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 3596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 3597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 3600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 3601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3602d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3608625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 36101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->initialize(callback_ops); 3611d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 36121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3615625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3616625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 3617625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3618625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 3624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 3625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 3626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 3629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 3631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3632d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 36391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->configureStreams(stream_list); 3640d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 36411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 3646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 3648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 3654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 3656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3657d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 36641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->registerStreamBuffers(buffer_set); 3665d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 36661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 3671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 3673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 3678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 3679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 36809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 36819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 36829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 3683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3685d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 3687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 3692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 369497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole fwk_metadata = hw->translateCapabilityToMetadata(type); 3695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3696d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 3698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 3702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 37109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 37119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 37129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 3713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3714d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 371580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 371680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 371780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 371880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 37199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 372080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 37219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 37221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->processCaptureRequest(request); 3723d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 37241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 3729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops( 3739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, 3740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang vendor_tag_query_ops_t* ops) 3741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3742d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->getMetadataVendorTagOps(ops); 3751d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 3757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3760625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3761625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3762625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3763625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3764625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3765625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3766e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump( 3767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, int fd) 3768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3769d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3770e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3771e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3772e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3773e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3774e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3775e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3776e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3777e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->dump(fd); 3778d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3779e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 3783c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * FUNCTION : flush 3784c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3785c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * DESCRIPTION: 3786c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3787c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * PARAMETERS : 3788c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3789c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * 3790c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang * RETURN : 3791c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang *==========================================================================*/ 3792c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 3793c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint QCamera3HardwareInterface::flush( 3794c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang const struct camera3_device *device) 3795c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang{ 3796c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang int rc; 3797c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGV("%s: E", __func__); 3798c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang QCamera3HardwareInterface *hw = 3799c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3800c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang if (!hw) { 3801c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGE("%s: NULL camera device", __func__); 3802c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return -EINVAL; 3803c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang } 3804c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 3805c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang rc = hw->flush(); 3806c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGV("%s: X", __func__); 3807c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang return rc; 3808c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang} 3809c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang 3810c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang/*=========================================================================== 3811e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : close_camera_device 3812e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3813e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 3814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 3816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3817e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3818e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 3819e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 3820e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 3821e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 3822d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3823e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int ret = NO_ERROR; 3824e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3825e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>( 3826e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<camera3_device_t *>(device)->priv); 3827e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3828e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("NULL camera device"); 3829e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return BAD_VALUE; 3830e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3831e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete hw; 3832cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 3833cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 3834cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 0; 3835cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 3836d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3837e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return ret; 3838e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 3839e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 38407ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 38417ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : getWaveletDenoiseProcessPlate 38427ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38437ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate 38447ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38457ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None 38467ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38477ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : WNR prcocess plate vlaue 38487ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 38497ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate() 38507ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 38517ee407aa1024789089aad411c372c79423699976Ajay Dudani char prop[PROPERTY_VALUE_MAX]; 38527ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(prop, 0, sizeof(prop)); 38537ee407aa1024789089aad411c372c79423699976Ajay Dudani property_get("persist.denoise.process.plates", prop, "0"); 38547ee407aa1024789089aad411c372c79423699976Ajay Dudani int processPlate = atoi(prop); 38557ee407aa1024789089aad411c372c79423699976Ajay Dudani switch(processPlate) { 38567ee407aa1024789089aad411c372c79423699976Ajay Dudani case 0: 38577ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_YCBCR_PLANE; 38587ee407aa1024789089aad411c372c79423699976Ajay Dudani case 1: 38597ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_CBCR_ONLY; 38607ee407aa1024789089aad411c372c79423699976Ajay Dudani case 2: 38617ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 38627ee407aa1024789089aad411c372c79423699976Ajay Dudani case 3: 38637ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINED_CBCR; 38647ee407aa1024789089aad411c372c79423699976Ajay Dudani default: 38657ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 38667ee407aa1024789089aad411c372c79423699976Ajay Dudani } 38677ee407aa1024789089aad411c372c79423699976Ajay Dudani} 38687ee407aa1024789089aad411c372c79423699976Ajay Dudani 38697ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 38707ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : needRotationReprocess 38717ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38727ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp 38737ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38747ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 38757ee407aa1024789089aad411c372c79423699976Ajay Dudani * 38767ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : true: needed 38777ee407aa1024789089aad411c372c79423699976Ajay Dudani * false: no need 38787ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 38797ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess() 38807ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 38817ee407aa1024789089aad411c372c79423699976Ajay Dudani 38827ee407aa1024789089aad411c372c79423699976Ajay Dudani if (!mJpegSettings->is_jpeg_format) { 38837ee407aa1024789089aad411c372c79423699976Ajay Dudani // RAW image, no need to reprocess 38847ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 38857ee407aa1024789089aad411c372c79423699976Ajay Dudani } 38867ee407aa1024789089aad411c372c79423699976Ajay Dudani 38877ee407aa1024789089aad411c372c79423699976Ajay Dudani if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 && 38887ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->jpeg_orientation > 0) { 38897ee407aa1024789089aad411c372c79423699976Ajay Dudani // current rotation is not zero, and pp has the capability to process rotation 38907ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGD("%s: need do reprocess for rotation", __func__); 38917ee407aa1024789089aad411c372c79423699976Ajay Dudani return true; 38927ee407aa1024789089aad411c372c79423699976Ajay Dudani } 38937ee407aa1024789089aad411c372c79423699976Ajay Dudani 38947ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 38957ee407aa1024789089aad411c372c79423699976Ajay Dudani} 38967ee407aa1024789089aad411c372c79423699976Ajay Dudani 38977ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 3898c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * FUNCTION : needReprocess 3899c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 3900c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * DESCRIPTION: if reprocess in needed 3901c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 3902c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * PARAMETERS : none 3903c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * 3904c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * RETURN : true: needed 3905c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan * false: no need 3906c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan *==========================================================================*/ 3907c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajanbool QCamera3HardwareInterface::needReprocess() 3908c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan{ 3909c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if (!mJpegSettings->is_jpeg_format) { 3910c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // RAW image, no need to reprocess 3911c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return false; 3912c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 3913c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 3914c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if ((mJpegSettings->min_required_pp_mask > 0) || 3915c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan isWNREnabled()) { 3916c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // TODO: add for ZSL HDR later 3917c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // pp module has min requirement for zsl reprocess, or WNR in ZSL mode 3918c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__); 3919c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return true; 3920c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 3921c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan return needRotationReprocess(); 3922c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan} 3923c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 3924c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan/*=========================================================================== 39257ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : addOnlineReprocChannel 39267ee407aa1024789089aad411c372c79423699976Ajay Dudani * 39277ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames 39287ee407aa1024789089aad411c372c79423699976Ajay Dudani * coming from input channel 39297ee407aa1024789089aad411c372c79423699976Ajay Dudani * 39307ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 39317ee407aa1024789089aad411c372c79423699976Ajay Dudani * @pInputChannel : ptr to input channel whose frames will be post-processed 39327ee407aa1024789089aad411c372c79423699976Ajay Dudani * 39337ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : Ptr to the newly created channel obj. NULL if failed. 39347ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 39357ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel( 3936d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle) 39377ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 39387ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t rc = NO_ERROR; 39397ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3ReprocessChannel *pChannel = NULL; 39407ee407aa1024789089aad411c372c79423699976Ajay Dudani if (pInputChannel == NULL) { 39417ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: input channel obj is NULL", __func__); 39427ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39437ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39447ee407aa1024789089aad411c372c79423699976Ajay Dudani 39457ee407aa1024789089aad411c372c79423699976Ajay Dudani pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle, 39467ee407aa1024789089aad411c372c79423699976Ajay Dudani mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle); 39477ee407aa1024789089aad411c372c79423699976Ajay Dudani if (NULL == pChannel) { 39487ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: no mem for reprocess channel", __func__); 39497ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39507ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39517ee407aa1024789089aad411c372c79423699976Ajay Dudani 39527ee407aa1024789089aad411c372c79423699976Ajay Dudani // Capture channel, only need snapshot and postview streams start together 39537ee407aa1024789089aad411c372c79423699976Ajay Dudani mm_camera_channel_attr_t attr; 39547ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 39557ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 39567ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue(); 39577ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->initialize(); 39587ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 39597ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc); 39607ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 39617ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39627ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39637ee407aa1024789089aad411c372c79423699976Ajay Dudani 39647ee407aa1024789089aad411c372c79423699976Ajay Dudani // pp feature config 39657ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_pp_feature_config_t pp_config; 39667ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&pp_config, 0, sizeof(cam_pp_feature_config_t)); 39677ee407aa1024789089aad411c372c79423699976Ajay Dudani if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) { 39687ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS; 39697ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.sharpness = 10; 39707ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39717ee407aa1024789089aad411c372c79423699976Ajay Dudani 39727ee407aa1024789089aad411c372c79423699976Ajay Dudani if (isWNREnabled()) { 39737ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D; 39747ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.denoise_enable = 1; 39757ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate(); 39767ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39777ee407aa1024789089aad411c372c79423699976Ajay Dudani if (needRotationReprocess()) { 39787ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION; 39797ee407aa1024789089aad411c372c79423699976Ajay Dudani int rotation = mJpegSettings->jpeg_orientation; 39807ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rotation == 0) { 39817ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_0; 39827ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 90) { 39837ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_90; 39847ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 180) { 39857ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_180; 39867ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 270) { 39877ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_270; 39887ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39897ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39907ee407aa1024789089aad411c372c79423699976Ajay Dudani 39917ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->addReprocStreamsFromSource(pp_config, 39927ee407aa1024789089aad411c372c79423699976Ajay Dudani pInputChannel, 39937ee407aa1024789089aad411c372c79423699976Ajay Dudani mMetadataChannel); 39947ee407aa1024789089aad411c372c79423699976Ajay Dudani 39957ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 39967ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 39977ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 39987ee407aa1024789089aad411c372c79423699976Ajay Dudani } 39997ee407aa1024789089aad411c372c79423699976Ajay Dudani return pChannel; 40007ee407aa1024789089aad411c372c79423699976Ajay Dudani} 40017ee407aa1024789089aad411c372c79423699976Ajay Dudani 40027ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue() 40037ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 40047ee407aa1024789089aad411c372c79423699976Ajay Dudani return gCamCapability[mCameraId]->min_num_pp_bufs; 40057ee407aa1024789089aad411c372c79423699976Ajay Dudani} 40067ee407aa1024789089aad411c372c79423699976Ajay Dudani 4007acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajanbool QCamera3HardwareInterface::isWNREnabled() { 4008acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan return gCamCapability[mCameraId]->isWnrSupported; 4009acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan} 4010acddfe2d2fd672d8dbf21caedf4e0c64571b049dMekala Natarajan 4011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 4012