QCamera3HWI.cpp revision 7ee407aa1024789089aad411c372c79423699976
1625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 2625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 3625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* Redistribution and use in source and binary forms, with or without 4625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* modification, are permitted provided that the following conditions are 5625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* met: 6625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Redistributions of source code must retain the above copyright 7625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* notice, this list of conditions and the following disclaimer. 8625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Redistributions in binary form must reproduce the above 9625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* copyright notice, this list of conditions and the following 10625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* disclaimer in the documentation and/or other materials provided 11625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* with the distribution. 12625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Neither the name of The Linux Foundation nor the names of its 13625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* contributors may be used to endorse or promote products derived 14625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* from this software without specific prior written permission. 15625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 16625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 28625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*/ 29625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 30625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define LOG_TAG "QCamera3HWI" 31625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <cutils/properties.h> 33625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h> 34625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <camera/CameraMetadata.h> 35625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <stdlib.h> 36625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h> 37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h> 38e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <ui/Fence.h> 39625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h> 40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h" 41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h" 42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h" 4366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h" 44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android; 46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera { 48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 49625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS]; 5080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings; 51b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wangconst camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS]; 52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 53cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangpthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock = 54cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang PTHREAD_MUTEX_INITIALIZER; 55cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wangunsigned int QCamera3HardwareInterface::mCameraSessionActive = 0; 56cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 57662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = { 58662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_OFF, CAM_EFFECT_MODE_OFF }, 59662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_MONO, CAM_EFFECT_MODE_MONO }, 60662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE, CAM_EFFECT_MODE_NEGATIVE }, 61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE, CAM_EFFECT_MODE_SOLARIZE }, 62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SEPIA, CAM_EFFECT_MODE_SEPIA }, 63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE, CAM_EFFECT_MODE_POSTERIZE }, 64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD }, 65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD }, 66662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_AQUA, CAM_EFFECT_MODE_AQUA } 67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = { 700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_OFF, CAM_WB_MODE_OFF }, 71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_AUTO, CAM_WB_MODE_AUTO }, 72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_INCANDESCENT, CAM_WB_MODE_INCANDESCENT }, 73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_FLUORESCENT, CAM_WB_MODE_FLUORESCENT }, 74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT}, 75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_DAYLIGHT, CAM_WB_MODE_DAYLIGHT }, 76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT }, 77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_TWILIGHT, CAM_WB_MODE_TWILIGHT }, 78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_SHADE, CAM_WB_MODE_SHADE } 79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = { 82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_ACTION, CAM_SCENE_MODE_ACTION }, 83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PORTRAIT, CAM_SCENE_MODE_PORTRAIT }, 84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE, CAM_SCENE_MODE_LANDSCAPE }, 85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT, CAM_SCENE_MODE_NIGHT }, 86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT }, 87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_THEATRE, CAM_SCENE_MODE_THEATRE }, 88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BEACH, CAM_SCENE_MODE_BEACH }, 89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SNOW, CAM_SCENE_MODE_SNOW }, 90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SUNSET, CAM_SCENE_MODE_SUNSET }, 91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO, CAM_SCENE_MODE_ANTISHAKE }, 92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_FIREWORKS , CAM_SCENE_MODE_FIREWORKS }, 93662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SPORTS , CAM_SCENE_MODE_SPORTS }, 94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PARTY, CAM_SCENE_MODE_PARTY }, 95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT, CAM_SCENE_MODE_CANDLELIGHT }, 9697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BARCODE, CAM_SCENE_MODE_BARCODE} 97662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 98662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = { 100b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang { ANDROID_CONTROL_AF_MODE_OFF, CAM_FOCUS_MODE_FIXED }, 101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_AUTO, CAM_FOCUS_MODE_AUTO }, 102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_MACRO, CAM_FOCUS_MODE_MACRO }, 103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_EDOF, CAM_FOCUS_MODE_EDOF }, 104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE }, 105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO, CAM_FOCUS_MODE_CONTINOUS_VIDEO } 106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = { 109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, CAM_ANTIBANDING_MODE_OFF }, 110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ }, 111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ }, 112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO } 113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 115e9a0b4995192d264f75543f62efa089845456291Shuzhen Wangconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = { 116e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_OFF, CAM_FLASH_MODE_OFF }, 117e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON, CAM_FLASH_MODE_OFF }, 118e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH, CAM_FLASH_MODE_AUTO}, 119e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH, CAM_FLASH_MODE_ON }, 120e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO} 121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = { 124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_OFF, CAM_FLASH_MODE_OFF }, 1256356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE }, 1266356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani { ANDROID_FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH } 127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 12908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftabconst int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288, 13008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab 320, 240, 176, 144, 0, 0}; 131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = { 133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang initialize: QCamera3HardwareInterface::initialize, 134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang configure_streams: QCamera3HardwareInterface::configure_streams, 135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang register_stream_buffers: QCamera3HardwareInterface::register_stream_buffers, 136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings, 137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang process_capture_request: QCamera3HardwareInterface::process_capture_request, 138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang get_metadata_vendor_tag_ops: QCamera3HardwareInterface::get_metadata_vendor_tag_ops, 139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang dump: QCamera3HardwareInterface::dump, 140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3HardwareInterface 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera ID 150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId) 154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang : mCameraId(cameraId), 155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle(NULL), 156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened(false), 157cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraInitialized(false), 15897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mCallbackOps(NULL), 15933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mInputStream(NULL), 16033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mMetadataChannel(NULL), 1617ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel(NULL), 16233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest(false), 16333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap(NULL), 16433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters(NULL), 16599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan mJpegSettings(NULL), 1668bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode(false), 16799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule(NULL) 168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0; 171e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.close = close_camera_device; 172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.ops = &mCameraOps; 173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.priv = this; 174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->version = CAM_HAL_V3; 1757ee407aa1024789089aad411c372c79423699976Ajay Dudani // TODO: hardcode for now until mctl add support for min_num_pp_bufs 1767ee407aa1024789089aad411c372c79423699976Ajay Dudani //TBD - To see if this hardcoding is needed. Check by printing if this is filled by mctl to 3 1777ee407aa1024789089aad411c372c79423699976Ajay Dudani gCamCapability[cameraId]->min_num_pp_bufs = 3; 1789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_init(&mRequestCond, NULL); 1809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 18174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = -1; 182e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_init(&mMutex, NULL); 18333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 18433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 18533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mDefaultMetadata[i] = NULL; 18699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan 18799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 18899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) { 18999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID); 19099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 19199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 19766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface 198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 205d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 206d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* We need to stop all streams before deleting any stream */ 2071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 2081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 2091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 210dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (channel) 2117ee407aa1024789089aad411c372c79423699976Ajay Dudani channel->stop(); 212d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang } 213d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 214d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang it != mStreamInfo.end(); it++) { 215d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 216dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (channel) 217dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang delete channel; 2181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free (*it); 2191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 2201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 2217ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel = NULL; 2227ee407aa1024789089aad411c372c79423699976Ajay Dudani 22397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (mJpegSettings != NULL) { 22497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole free(mJpegSettings); 22597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mJpegSettings = NULL; 22697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 227dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 228dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang /* Clean up all channels */ 229dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (mCameraInitialized) { 230d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani mMetadataChannel->stop(); 231d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani delete mMetadataChannel; 232d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani mMetadataChannel = NULL; 233dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang deinitParameters(); 234dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang } 235dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 236cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraOpened) 237cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang closeCamera(); 238e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 23933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 24033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (mDefaultMetadata[i]) 24133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang free_camera_metadata(mDefaultMetadata[i]); 24233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 243e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_cond_destroy(&mRequestCond); 244e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 245e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mMutex); 246d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 264cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 265cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraSessionActive) { 266cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang ALOGE("%s: multiple simultaneous camera instance not supported", __func__); 267cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 268cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang return INVALID_OPERATION; 269cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } 270cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 277cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (rc == 0) { 278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 279cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 1; 280cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } else 281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 282cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 28399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 28499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == 0) { 28599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 28699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 28799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 28899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=1"); 28999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 29099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 29199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 29299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 293cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 34499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 34599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == NO_ERROR) { 34699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 34799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 34899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 34999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=0"); 35099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 35199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 35299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 35399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 35499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan 355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 374e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 375e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 37633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang rc = initParameters(); 37733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (rc < 0) { 37833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang ALOGE("%s: initParamters failed %d", __func__, rc); 37933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang goto err1; 38033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } 381d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani //Create metadata channel and initialize it 382d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 383d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani mCameraHandle->ops, captureResultCb, 384d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani &gCamCapability[mCameraId]->padding_info, this); 385d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani if (mMetadataChannel == NULL) { 386d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani ALOGE("%s: failed to allocate metadata channel", __func__); 387d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani rc = -ENOMEM; 388d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani goto err2; 389d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani } 390d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani rc = mMetadataChannel->initialize(); 391d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani if (rc < 0) { 392d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani ALOGE("%s: metadata channel initialization failed", __func__); 393d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani goto err3; 394d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani } 395d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani 3969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCallbackOps = callback_ops; 397e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 398e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 399cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraInitialized = true; 4009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 4019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 402d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudanierr3: 403d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani delete mMetadataChannel; 404d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani mMetadataChannel = NULL; 405d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudanierr2: 406d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani deinitParameters(); 4079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1: 408e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 4099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 42733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int rc = 0; 4280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_lock(&mMutex); 429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 432e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 438e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 445e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *inputStream = NULL; 450c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang camera3_stream_t *jpegStream = NULL; 4510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /* first invalidate all the steams in the mStreamList 4520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * if they appear again, they will be validated */ 4531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 455d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 456d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang channel->stop(); 4570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = INVALID; 4580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 459d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 462c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d", 463c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, newStream->stream_type, newStream->format, 464c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang newStream->width, newStream->height); 4650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //if the stream is in the mStreamList validate it 4660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole bool stream_exists = false; 4671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 4690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if ((*it)->stream == newStream) { 4701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = 4711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (QCamera3Channel*)(*it)->stream->priv; 4720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_exists = true; 4730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = RECONFIGURE; 4741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*delete the channel object associated with the stream because 4751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole we need to reconfigure*/ 4761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 4771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->stream->priv = NULL; 4780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (!stream_exists) { 4810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //new stream 4820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info_t* stream_info; 4830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info = (stream_info_t* )malloc(sizeof(stream_info_t)); 4840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->stream = newStream; 4850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->status = VALID; 4861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole stream_info->registered = 0; 4870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mStreamInfo.push_back(stream_info); 4880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 489c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT 490c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) { 491625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 492625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 493e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 496625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 498c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->format == HAL_PIXEL_FORMAT_BLOB) { 499c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream = newStream; 500c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /*clean up invalid streams*/ 5051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 5061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end();) { 5070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if(((*it)->status) == INVALID){ 5081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 5091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 5100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole delete[] (buffer_handle_t*)(*it)->buffer_set.buffers; 5110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole free(*it); 5121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it = mStreamInfo.erase(it); 5131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 5141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it++; 5150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 518d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani //mMetadataChannel->stop(); 519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 526f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_INPUT: 527f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 528f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 529f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_BIDIRECTIONAL: 530f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 531f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab GRALLOC_USAGE_HW_CAMERA_WRITE; 532f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 533f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_OUTPUT: 534f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 535f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 536f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 537f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 538f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 5421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 545f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 5468867984d33ed870071109a4500402dddbc85c048Shuzhen Wang case HAL_PIXEL_FORMAT_YCbCr_420_888: 547f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 548c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 549c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream) { 550c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t width = jpegStream->width; 551c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t height = jpegStream->height; 5528bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode = true; 553c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 554c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mCameraHandle->ops, captureResultCb, 555c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this, newStream, 556c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang width, height); 557c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else 558c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 559f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 560f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 561f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 562f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 563f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 564f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 565f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 566f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 567f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 568f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 569f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_BLOB: 570f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 5717ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle, 572f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 573f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 5747ee407aa1024789089aad411c372c79423699976Ajay Dudani if (mPictureChannel == NULL) { 575f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 576f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 577f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 578f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 5797ee407aa1024789089aad411c372c79423699976Ajay Dudani newStream->priv = (QCamera3Channel*)mPictureChannel; 580f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 581f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 582f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab //TODO: Add support for app consumed format? 583f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 584f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 585f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 5938867984d33ed870071109a4500402dddbc85c048Shuzhen Wang /*For the streams to be reconfigured we need to register the buffers 5941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole since the framework wont*/ 5951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 5961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 5971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->status == RECONFIGURE) { 5981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 5991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*only register buffers for streams that have already been 6001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole registered*/ 6011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->registered) { 6021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = channel->registerBuffers((*it)->buffer_set.num_buffers, 6031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers); 6041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (rc != NO_ERROR) { 6051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Failed to register the buffers of old stream,\ 6061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = %d", __func__, rc); 6071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 608a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: channel %p has %d buffers", 609e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, channel, (*it)->buffer_set.num_buffers); 6100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream); 6141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (index == NAME_NOT_FOUND) { 6151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.add((*it)->stream, 0); 6161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 6171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueAt(index) = 0; 6181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 6190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Initialize mPendingRequestInfo and mPendnigBuffersMap */ 6221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.clear(); 6231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 62433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang //settings/parameters don't carry over for new configureStreams 6259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 62633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest = true; 62733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 628e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 62933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return rc; 630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 633e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : validateCaptureRequest 634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 635e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service 63680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 63780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 63880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 63980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 64080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 64180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 64280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 643e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest( 6449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 64580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 6469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 6479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 6489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 6499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 6519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 6529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 6539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 6579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 6589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 6599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 6609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 6619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 6649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 6659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 6669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 669c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang b = request->input_buffer; 670c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel *channel = 671c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 672c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (channel == NULL) { 673c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 674c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 675c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 676c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 677c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 678c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 679c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 680c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 681c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 682c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->release_fence != -1) { 683c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 684c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 685c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 686c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 687c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->buffer == NULL) { 688c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 689c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 690c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 691c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 6929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 6959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 6969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 6979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 6989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 7059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 7069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 7159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 7169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 7209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 7219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 7229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : registerStreamBuffers 728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @stream_list : streams to be configured 733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = 0; 741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set == NULL) { 745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->stream == NULL) { 750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->num_buffers < 1) { 755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 756e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 757e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 758e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->buffers == NULL) { 760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 762e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 763e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 764e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 765e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 766e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 7680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //set the buffer_set in the mStreamInfo array 7691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 7701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 7711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->stream == stream) { 7720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint32_t numBuffers = buffer_set->num_buffers; 7731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.stream = buffer_set->stream; 7741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.num_buffers = numBuffers; 7751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers]; 7761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->buffer_set.buffers == NULL) { 7770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Failed to allocate buffer_handle_t*", __func__); 7780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_unlock(&mMutex); 7790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole return -ENOMEM; 7800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (size_t j = 0; j < numBuffers; j++){ 7821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers[j] = buffer_set->buffers[j]; 7830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->registered = 1; 7850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 787e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 788e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENODEV; 792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 794e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 795e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 796e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 797e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 798e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 799e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : processCaptureRequest 800e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 801e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service 802e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 803e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @request : request from framework to process 805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 809e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 810e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_request_t *request) 811e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 812e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = NO_ERROR; 81374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id; 814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata meta; 815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 817e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 818e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = validateCaptureRequest(request); 819e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != NO_ERROR) { 820e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: incoming request is not valid", __func__); 821e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 822e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 823e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 824e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 825e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frameNumber = request->frame_number; 826662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = setFrameParameters(request->frame_number, request->settings); 8279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 8289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: fail to set frame parameters", __func__); 829e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 8309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 8319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 83374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab meta = request->settings; 83474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab if (meta.exists(ANDROID_REQUEST_ID)) { 83574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0]; 83674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = request_id; 837013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Received request with id: %d",__func__, request_id); 83874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else if (mFirstRequest || mCurrentRequestId == -1){ 83974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab ALOGE("%s: Unable to find request id field, \ 84074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab & no previous id available", __func__); 84174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab return NAME_NOT_FOUND; 84274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else { 843013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Re-using old request id", __func__); 84474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = mCurrentRequestId; 84574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } 84674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 847c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGV("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d", 848c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, __LINE__, 849c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->num_output_buffers, 850c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer, 851c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang frameNumber); 852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // Acquire all request buffers first 8537ee407aa1024789089aad411c372c79423699976Ajay Dudani int blob_request = 0; 854e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 855e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 856e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang sp<Fence> acquireFence = new Fence(output.acquire_fence); 85766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 85866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 85966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Call function to store local copy of jpeg data for encode params. 8607ee407aa1024789089aad411c372c79423699976Ajay Dudani blob_request = 1; 86166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = getJpegSettings(request->settings); 86266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (rc < 0) { 8630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: failed to get jpeg parameters", __func__); 86466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pthread_mutex_unlock(&mMutex); 86566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 86666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 86766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 86866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 869e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 870e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != OK) { 871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: fence wait failed %d", __func__, rc); 872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 8771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Update pending request list and pending buffers map */ 8781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole PendingRequestInfo pendingRequest; 8791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.frame_number = frameNumber; 8801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.num_buffers = request->num_output_buffers; 88174f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab pendingRequest.request_id = request_id; 8827ee407aa1024789089aad411c372c79423699976Ajay Dudani pendingRequest.blob_request = blob_request; 88374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 8841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < request->num_output_buffers; i++) { 8851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole RequestedBufferInfo requestedBuf; 8861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.stream = request->output_buffers[i].stream; 8871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.buffer = NULL; 8881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.buffers.push_back(requestedBuf); 8891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 8901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(requestedBuf.stream)++; 8911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 8921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.push_back(pendingRequest); 8931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 8949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 895e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMetadataChannel->request(NULL, frameNumber); 8969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 8979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 8989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 8999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 9009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 901c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mm_camera_buf_def_t *pInputBuffer = NULL; 90266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 9039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 9049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 9059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 9069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 9079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 90866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 909c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3RegularChannel* inputChannel = NULL; 910c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(request->input_buffer != NULL){ 911c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 912c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang //Try to get the internal format 913c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel = (QCamera3RegularChannel*) 914c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->stream->priv; 915c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(inputChannel == NULL ){ 916c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: failed to get input channel handle", __func__); 917c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else { 918c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer = 919c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel->getInternalFormatBuffer( 920c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->buffer); 921c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("%s: Input buffer dump",__func__); 922c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("Stream id: %d", pInputBuffer->stream_id); 923c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("streamtype:%d", pInputBuffer->stream_type); 924c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("frame len:%d", pInputBuffer->frame_len); 925c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 926c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 927c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang rc = channel->request(output.buffer, frameNumber, mJpegSettings, 928c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer,(QCamera3Channel*)inputChannel); 92966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 930a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__, 931a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab __LINE__, output.buffer, frameNumber); 93266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = channel->request(output.buffer, frameNumber); 93366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 9349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 9359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 9369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 9379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 9381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mFirstRequest = false; 9391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 9419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 1; 9429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang while (mPendingRequest == 1) { 9435b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_cond_wait(&mRequestCond, &mMutex); 9449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 9459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 946e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 94780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 94880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 94980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 9509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 951e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : getMetadataVendorTagOps 9529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 953e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 9549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 9559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 956e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 957e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 958e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 959e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 960b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps( 961b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang vendor_tag_query_ops_t* /*ops*/) 962e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 963e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Enable locks when we eventually add Vendor Tags */ 964e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 966e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 967e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 968e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 969e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 970e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 971e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 972e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 973e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : dump 974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 976e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 977e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 980e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 981e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 982b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/) 983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /*Enable lock when we implement this function*/ 985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 986e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 987e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 988e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 989e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 990e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 991e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 992e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 9937ee407aa1024789089aad411c372c79423699976Ajay Dudani 994e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 995e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 996e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 99733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result 99833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * (streams, as well as metadata) 999e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1000e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @metadata : metadata information 100233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. 100333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * NULL if metadata. 10049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 10059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 10069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 10071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf, 1008e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 10099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 10105b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_lock(&mMutex); 1011e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 10121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (metadata_buf) { 10131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer; 101433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int32_t frame_number_valid = *(int32_t *) 101533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata); 1016152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang uint32_t pending_requests = *(uint32_t *)POINTER_OF( 1017152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang CAM_INTF_META_PENDING_REQUESTS, metadata); 101833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang uint32_t frame_number = *(uint32_t *) 101933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata); 10200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole const struct timeval *tv = (const struct timeval *) 10210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata); 10220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC + 10230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole tv->tv_usec * NSEC_PER_USEC; 10240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 10251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!frame_number_valid) { 1026a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: Not a valid frame number, used as SOF only", __func__); 10271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->bufDone(metadata_buf); 10281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole goto done_metadata; 10291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1030a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__, 1031e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang frame_number, capture_time); 10321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Go through the pending requests info and send shutter/results to frameworks 10341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1035e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i != mPendingRequestsList.end() && i->frame_number <= frame_number;) { 10361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 10371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_notify_msg_t notify_msg; 1038a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number); 10391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Flush out all entries with less or equal frame numbers. 10411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 1042e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: Make sure shutter timestamp really reflects shutter timestamp. 1043e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //Right now it's the same as metadata timestamp 1044e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 1045e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: When there is metadata drop, how do we derive the timestamp of 1046e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //dropped frames? For now, we fake the dropped timestamp by substracting 1047e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //from the reported timestamp 1048e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang nsecs_t current_capture_time = capture_time - 1049e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang (frame_number - i->frame_number) * NSEC_PER_33MSEC; 1050e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send shutter notify to frameworks 10521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.type = CAMERA3_MSG_SHUTTER; 10531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.message.shutter.frame_number = i->frame_number; 1054e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang notify_msg.message.shutter.timestamp = current_capture_time; 10551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1056a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__, 1057e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i->frame_number, capture_time); 10581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send empty metadata with already filled buffers for dropped metadata 10601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // and send valid metadata with already filled buffers for current metadata 10611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i->frame_number < frame_number) { 106299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang CameraMetadata dummyMetadata; 106399b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP, 1064e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ¤t_capture_time, 1); 106599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_REQUEST_ID, 106674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab &(i->request_id), 1); 106799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang result.result = dummyMetadata.release(); 10681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 1069e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.result = translateCbMetadataToResultMetadata(metadata, 107074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab current_capture_time, i->request_id); 10717ee407aa1024789089aad411c372c79423699976Ajay Dudani if (i->blob_request) { 10727ee407aa1024789089aad411c372c79423699976Ajay Dudani //If it is a blob request then send the metadata to the picture channel 10737ee407aa1024789089aad411c372c79423699976Ajay Dudani mPictureChannel->queueMetadata(metadata_buf); 10747ee407aa1024789089aad411c372c79423699976Ajay Dudani 10757ee407aa1024789089aad411c372c79423699976Ajay Dudani } else { 10767ee407aa1024789089aad411c372c79423699976Ajay Dudani // Return metadata buffer 10777ee407aa1024789089aad411c372c79423699976Ajay Dudani mMetadataChannel->bufDone(metadata_buf); 10787ee407aa1024789089aad411c372c79423699976Ajay Dudani free(metadata_buf); 10797ee407aa1024789089aad411c372c79423699976Ajay Dudani } 10801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result.result) { 10821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: metadata is NULL", __func__); 10831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.frame_number = i->frame_number; 10851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 0; 1086e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.output_buffers = NULL; 10871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1088e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 10891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 10901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers++; 10911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (result.num_output_buffers > 0) { 10951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_stream_buffer_t *result_buffers = 10961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole new camera3_stream_buffer_t[result.num_output_buffers]; 10971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result_buffers) { 10981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Fatal error: out of memory", __func__); 10991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole size_t result_buffers_idx = 0; 11011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1102e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 11031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 11041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result_buffers[result_buffers_idx++] = *(j->buffer); 11051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free(j->buffer); 110613dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang j->buffer = NULL; 11071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(j->stream)--; 11081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = result_buffers; 11111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 11121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1113a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: meta frame_number = %d, capture_time = %lld", 1114d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 11151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 11161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete[] result_buffers; 11171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 11181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1119a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: meta frame_number = %d, capture_time = %lld", 1120d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 11211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 11221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // erase the element from the list 11241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i = mPendingRequestsList.erase(i); 11251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 112633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 112733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 11281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata: 11291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole bool max_buffers_dequeued = false; 11301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < mPendingBuffersMap.size(); i++) { 11311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i); 1132e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang uint32_t queued_buffers = mPendingBuffersMap.valueAt(i); 11331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (queued_buffers == stream->max_buffers) { 11341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole max_buffers_dequeued = true; 11351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole break; 11361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1138152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang if (!max_buffers_dequeued && !pending_requests) { 11391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Unblock process_capture_request 11401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequest = 0; 11411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_cond_signal(&mRequestCond); 11421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 11441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // If the frame number doesn't exist in the pending request list, 11451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // directly send the buffer to the frameworks, and update pending buffers map 11461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Otherwise, book-keep the buffer. 11471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1148c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang while (i != mPendingRequestsList.end() && i->frame_number != frame_number){ 11491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i++; 1150c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 11511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i == mPendingRequestsList.end()) { 11521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Verify all pending requests frame_numbers are greater 11531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin(); 1154e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != mPendingRequestsList.end(); j++) { 11551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->frame_number < frame_number) { 11561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: pending frame number %d is smaller than %d", 11571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole __func__, j->frame_number, frame_number); 11581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 11611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.result = NULL; 116233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang result.frame_number = frame_number; 11631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 1; 11641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = buffer; 1165a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: result frame_number = %d, buffer = %p", 1166e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, frame_number, buffer); 11671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(buffer->stream)--; 1168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 116933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } else { 11701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1171e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 11721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->stream == buffer->stream) { 11731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer != NULL) { 11741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: buffer is already set", __func__); 11751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 11761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole j->buffer = (camera3_stream_buffer_t *)malloc( 11771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(camera3_stream_buffer_t)); 11781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole *(j->buffer) = *buffer; 1179a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: cache buffer %p at result frame_number %d", 1180e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, buffer, frame_number); 11811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1184e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 11859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 11865b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_unlock(&mMutex); 11879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 11889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 11899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 119097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 119197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : translateCbMetadataToResultMetadata 119297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 119397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: 119497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 119597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 119697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @metadata : metadata information from callback 119797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 119897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN : camera_metadata_t* 119997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * metadata in a format specified by fwk 120097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 120197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* 120297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata 120374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab (metadata_buffer_t *metadata, nsecs_t timestamp, 120474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id) 120597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 120697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata camMetadata; 120797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camera_metadata_t* resultMetadata; 120897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); 121074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1); 121197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 121297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_HISTOGRAM - TODO*/ 121397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*cam_hist_stats_t *histogram = 121497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM, 121597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole metadata);*/ 121697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 121797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*face detection*/ 121897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *) 121997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata); 122097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t numFaces = faceDetectionInfo->num_faces_detected; 122197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceIds[numFaces]; 122297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t faceScores[numFaces]; 122397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceRectangles[numFaces * 4]; 122497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceLandmarks[numFaces * 6]; 122597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int j = 0, k = 0; 122697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < numFaces; i++) { 122797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceIds[i] = faceDetectionInfo->faces[i].face_id; 122897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceScores[i] = faceDetectionInfo->faces[i].score; 122959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(faceDetectionInfo->faces[i].face_boundary, 123097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles+j, -1); 123197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k); 123297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole j+= 4; 123397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole k+= 6; 123497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 123599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang if (numFaces > 0) { 123699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces); 123799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces); 123899b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES, 123997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles, numFaces*4); 124099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS, 124197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceLandmarks, numFaces*6); 124299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang } 124397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12448867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t *color_correct_mode = 12450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata); 124697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1); 124797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 124897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *ae_precapture_id = 124997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata); 125097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1); 125197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 125297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*aec regions*/ 125397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAeRegions = 125497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata); 125597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t aeRegions[5]; 125659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight); 125797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5); 12588bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani if(mIsZslMode) { 12598bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani uint8_t ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED; 12608bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani camMetadata.update(ANDROID_CONTROL_AE_STATE, &ae_state, 1); 12618bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani } else { 12628bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani uint8_t *ae_state = 12638bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata); 12648bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1); 12658bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani } 12660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *focusMode = 12670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata); 126897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1); 126997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 127097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*af regions*/ 127197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAfRegions = 127297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata); 127397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t afRegions[5]; 127459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight); 127597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5); 127697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata); 127897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1); 127997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 128097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *afTriggerId = 128197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata); 128297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1); 128397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalance = 12850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata); 128697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1); 128797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 128897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*awb regions*/ 128997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAwbRegions = 129097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata); 129197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t awbRegions[5]; 129259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight); 129397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5); 129497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalanceState = 12960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata); 129797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1); 129897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata); 130097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_MODE, mode, 1); 130197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata); 130397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1); 130497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashPower = 13060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata); 130797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1); 130897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 130997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *flashFiringTime = 131097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata); 131197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1); 131297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 131397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *ledMode = 131497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata); 131597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/ 131697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashState = 13180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata); 131997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_STATE, flashState, 1); 132097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *hotPixelMode = 13220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata); 132397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1); 132497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 132597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *lensAperture = 132697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata); 132797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1); 132897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 132997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *filterDensity = 133097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata); 133197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1); 133297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 133397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focalLength = 133497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata); 133597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1); 133697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 133797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusDistance = 133897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata); 133997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1); 134097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 134197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusRange = 134297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata); 134397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1); 134497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *opticalStab = 13460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata); 13470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1); 134897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 134997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *focusState = 135097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata); 135197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */ 135297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *noiseRedMode = 13540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata); 135597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1); 135697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 135797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_SCALER_CROP_REGION - check size*/ 135897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_crop_region_t *hScalerCropRegion =(cam_crop_region_t *) 136097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata); 136171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t scalerCropRegion[4]; 13620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[0] = hScalerCropRegion->left; 13630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[1] = hScalerCropRegion->top; 13640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[2] = hScalerCropRegion->width; 136571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropRegion[3] = hScalerCropRegion->height; 136671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4); 136797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 136897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorExpTime = 136997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata); 137097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1); 137197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 137297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorFameDuration = 137397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata); 137497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1); 137597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 137697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *sensorSensitivity = 137797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata); 13783fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mMetadataResponse.iso_speed = *sensorSensitivity; 137997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1); 138097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *shadingMode = 13820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata); 138397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1); 138497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *faceDetectMode = 13860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata); 138797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1); 138897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *histogramMode = 13900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata); 139197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1); 139297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *sharpnessMapMode = 13940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata); 139597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 139697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole sharpnessMapMode, 1); 139797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 139897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/ 139997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_sharpness_map_t *sharpnessMap = (cam_sharpness_map_t *) 140097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata); 140197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP, 140297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t*)sharpnessMap->sharpness, 140397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT); 140497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 140597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole resultMetadata = camMetadata.release(); 140633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return resultMetadata; 140797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 140897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 140997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 141059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertToRegions 141197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 141297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array 141397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 141497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 141597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @rect : cam_rect_t struct to convert 141697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @region : int32_t destination array 141797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @weight : if we are converting from cam_area_t, weight is valid 141897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * else weight = -1 141997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 142097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 142159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){ 142297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[0] = rect.left; 142397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[1] = rect.top; 142459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[2] = rect.left + rect.width; 142559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[3] = rect.top + rect.height; 142697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (weight > -1) { 142797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[4] = weight; 142897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 142997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 143059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 143159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*=========================================================================== 143259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertFromRegions 143359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 143459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t 143559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 143659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS : 143759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @rect : cam_rect_t struct to convert 143859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @region : int32_t destination array 143959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @weight : if we are converting from cam_area_t, weight is valid 144059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * else weight = -1 144159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 144259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/ 144359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi, 144459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang const camera_metadata_t *settings, 144559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang uint32_t tag){ 144659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang CameraMetadata frame_settings; 144759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang frame_settings = settings; 144859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_min = frame_settings.find(tag).data.i32[0]; 144959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_min = frame_settings.find(tag).data.i32[1]; 145059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_max = frame_settings.find(tag).data.i32[2]; 145159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_max = frame_settings.find(tag).data.i32[3]; 145259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->weight = frame_settings.find(tag).data.i32[4]; 145359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.left = x_min; 145459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.top = y_min; 145559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.width = x_max - x_min; 145659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.height = y_max - y_min; 145759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang} 145859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 145997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 146071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION : resetIfNeededROI 146171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 146271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler 146371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * crop region 146471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 146571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS : 146671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @roi : cam_area_t struct to resize 146771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @scalerCropRegion : cam_crop_region_t region to compare against 146871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 146971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 147071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/ 147171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi, 147271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang const cam_crop_region_t* scalerCropRegion) 147371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{ 147471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_x_max = roi->rect.width + roi->rect.left; 147571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_y_max = roi->rect.height + roi->rect.top; 147671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top; 147771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left; 147871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if ((roi_x_max < scalerCropRegion->left) || 147971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi_y_max < scalerCropRegion->top) || 148071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.left > crop_x_max) || 148171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.top > crop_y_max)){ 148271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return false; 148371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 148471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.left < scalerCropRegion->left) { 148571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.left = scalerCropRegion->left; 148671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 148771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.top < scalerCropRegion->top) { 148871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.top = scalerCropRegion->top; 148971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 149071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_x_max > crop_x_max) { 149171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_x_max = crop_x_max; 149271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 149371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_y_max > crop_y_max) { 149471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_y_max = crop_y_max; 149571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 149671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.width = roi_x_max - roi->rect.left; 149771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.height = roi_y_max - roi->rect.top; 149871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return true; 149971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang} 150071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang 150171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*=========================================================================== 150297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : convertLandmarks 150397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 150497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info 150597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 150697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 150797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @face : cam_rect_t struct to convert 150897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @landmarks : int32_t destination array 150997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 151097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 151197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 151297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks) 151397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 151497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[0] = face.left_eye_center.x; 151597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[1] = face.left_eye_center.y; 151697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[2] = face.right_eye_center.y; 151797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[3] = face.right_eye_center.y; 151897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[4] = face.mouth_center.x; 151997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[5] = face.mouth_center.y; 152097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 152197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 1523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 1525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 1527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1530625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1532625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 1533625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 1534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 1536625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 1538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 1539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 1540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 1542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 1543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 1544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 1545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 1546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1548e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 1549e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (capabilityHeap == NULL) { 1550e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: creation of capabilityHeap failed", __func__); 1551e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang goto heap_creation_failed; 1552e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 1554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 1555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 1556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 1557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 1558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 1561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 1562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 1563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 1564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 1565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 1568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 1569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 1572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 1573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 1575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 1578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 1579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 1580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 1583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 1585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 1587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 1588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 1589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 1590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 1591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 1592e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete capabilityHeap; 1593e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed: 1594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 1595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 1596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 1597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1601662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : initParameters 1602662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1603662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters 1604662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1605662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1606662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1607662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1608662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 1609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters() 1612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 1614662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Allocate Set Param Buffer 1616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = new QCamera3HeapMemory(); 1617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 1618662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc != OK) { 1619662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = NO_MEMORY; 1620662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("Failed to allocate SETPARM Heap memory"); 1621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1622662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1623662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1624662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Map memory for parameters buffer 1627662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 1628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole CAM_MAPPING_BUF_TYPE_PARM_BUF, 1629662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->getFd(0), 1630662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(parm_buffer_t)); 1631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc < 0) { 1632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:failed to map SETPARM buffer",__func__); 1633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = FAILED_TRANSACTION; 1634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->deallocate(); 1635662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1636662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1637662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1638662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1639662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1640662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0); 1641662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1642662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1643662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1644662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 164533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION : deinitParameters 164633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 164733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters 164833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 164933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS : 165033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 165133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN : NONE 165233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/ 165333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters() 165433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{ 165533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 165633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF); 165733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 165833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap->deallocate(); 165933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang delete mParamHeap; 166033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap = NULL; 166133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 166233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters = NULL; 166333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang} 166433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 166533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*=========================================================================== 16660a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION : calcMaxJpegSize 16670a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 16680a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId 16690a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 16700a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS : 16710a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 16720a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN : max_jpeg_size 16730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/ 16740a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize() 16750a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{ 16760a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int32_t max_jpeg_size = 0; 16770a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int temp_width, temp_height; 16780a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 16790a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width; 16800a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height; 16810a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab if (temp_width * temp_height > max_jpeg_size ) { 16820a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = temp_width * temp_height; 16830a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 16840a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 16850a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 16860a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab return max_jpeg_size; 16870a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab} 16880a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab 16890a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*=========================================================================== 1690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 1691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 1693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 1699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 1700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 1702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 170497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata staticInfo; 1705c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 1706c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang /* android.info: hardware level */ 1707c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL; 1708c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, 1709c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &supportedHardwareLevel, 1); 1710c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 1711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK; 1712662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 3 only*/ 17132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 17142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); */ 17152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 1716e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang /*hard coded for now but this should come from sensor*/ 1717e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang float min_focus_distance; 1718e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if(facingBack){ 1719e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 10; 1720e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 1721e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 0; 1722e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 1723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 17242dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &min_focus_distance, 1); 1725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 1727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 1728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1729c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*should be using focal lengths but sensor doesn't provide that info now*/ 1730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 1731c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &gCamCapability[cameraId]->focal_length, 1732c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1); 1733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 1735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 1736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 1737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 1739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 1740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 1741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 1744c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)gCamCapability[cameraId]->optical_stab_modes, 1745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 1746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 174780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 174880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 174980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 175080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 175147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 175280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 175380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 175480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 175580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 1756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 175747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 17580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->geo_correction_map_size.height}; 175980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 176080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 176180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 176280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 176380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 176480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 1765c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float)); 176680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 176780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 176880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 176980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 177080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 177180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 177280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 177380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 177480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 177580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 177680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 177780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 1778c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1); 177980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 178047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 178180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 178280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 178380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 178480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 178522817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t active_array_size[] = {0, 0, 178622817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala gCamCapability[cameraId]->active_array_size.width, 178780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 178880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 178922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala active_array_size, 4); 179080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 179180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 179280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 1793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 179480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 179580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 179680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 179780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 179880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 179980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 180080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 180180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 180280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1803c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 1804c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/ 1805c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*hardcode 0 for now*/ 1806c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang int32_t max_face_count = 0; 180780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 1808c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &max_face_count, 1); 180980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 181080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 181180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 181280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 181380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 181480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 181580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 181647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 181780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 181880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 181980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 182080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 182180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 182280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 182380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 182480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 182580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 182680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 182780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 182880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 182980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 183022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888, 183122817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB}; 183222817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t); 1833662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 1834662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats, 18358867984d33ed870071109a4500402dddbc85c048Shuzhen Wang scalar_formats_count); 1836662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 183747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_processed_sizes[CAM_FORMAT_MAX * 2]; 1838662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole makeTable(gCamCapability[cameraId]->supported_sizes_tbl, 1839662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->supported_sizes_tbl_cnt, 1840662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes); 1841662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 1842662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes, 1843c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->supported_sizes_tbl_cnt) * 2); 1844e936796df0426c326d043c2359c149024526f4bcShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, 1845e936796df0426c326d043c2359c149024526f4bcShuzhen Wang &gCamCapability[cameraId]->min_duration[0], 1846e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[cameraId]->supported_sizes_tbl_cnt); 18470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 184847a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_fps_ranges[MAX_SIZES_CNT * 2]; 18490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl, 18500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->fps_ranges_tbl_cnt, 18510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole available_fps_ranges); 1852c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 1853c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) ); 1854c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 185547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang camera_metadata_rational exposureCompensationStep = { 1856c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.numerator, 1857c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.denominator}; 1858c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1859c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &exposureCompensationStep, 1); 1860c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1861c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*TO DO*/ 186247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF}; 1863c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 1864c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableVstabModes, sizeof(availableVstabModes)); 1865c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1866b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang /*HAL 1 and HAL 3 common*/ 18679443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab float maxZoom = 4; 1868c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 1869c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &maxZoom, 1); 1870c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 187147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max3aRegions = 1; 1872c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_MAX_REGIONS, 1873c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &max3aRegions, 1); 1874c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 187547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableFaceDetectModes[] = { 187647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_OFF }; 1877c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 1878c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableFaceDetectModes, 1879c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(availableFaceDetectModes)); 1880c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 188147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width, 1882662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->raw_dim.height}; 1883662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 1884662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole raw_size, 1885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(raw_size)/sizeof(uint32_t)); 1886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 188747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 188880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 188980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 189080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 189180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 189280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1893662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint8_t lensFacing = (facingBack) ? 189480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 189580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 1896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 189747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_jpeg_sizes[MAX_SIZES_CNT * 2]; 1898662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole makeTable(gCamCapability[cameraId]->picture_sizes_tbl, 1899662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->picture_sizes_tbl_cnt, 1900662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_jpeg_sizes); 1901662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 1902662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_jpeg_sizes, 1903c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2)); 1904c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1905c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 190608ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab available_thumbnail_sizes, 190708ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab sizeof(available_thumbnail_sizes)/sizeof(int32_t)); 1908662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 190947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max_jpeg_size = 0; 191097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int temp_width, temp_height; 191197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 191297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width; 191397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height; 191497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (temp_width * temp_height > max_jpeg_size ) { 191597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = temp_width * temp_height; 191697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 191797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 191897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 191997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole staticInfo.update(ANDROID_JPEG_MAX_SIZE, 192097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole &max_jpeg_size, 1); 192197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 192247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_effects[CAM_EFFECT_MODE_MAX]; 19230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t size = 0; 1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) { 19250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(EFFECT_MODES_MAP, 1926b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]), 19270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_effects[i]); 19280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 19290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_effects[size] = (uint8_t)val; 19300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 19310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1932662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 1934662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_effects, 19350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 193747a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX]; 1938e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t supported_indexes[CAM_SCENE_MODE_MAX]; 19392dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang int32_t supported_scene_modes_cnt = 0; 1940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) { 19410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(SCENE_MODES_MAP, 1942b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 19430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_scene_modes[i]); 19440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 1945e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val; 1946e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_indexes[supported_scene_modes_cnt] = i; 19472dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt++; 19480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1949662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1950e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 1951662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 1952662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_scene_modes, 19532dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt); 1954662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 195547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3]; 1956e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides, 1957e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt, 1958e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 19599443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supported_indexes, 19609443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab cameraId); 1961e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 1962e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 1963e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt*3); 1964e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 196547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX]; 19660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) { 19680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(ANTIBANDING_MODES_MAP, 1969b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 1970b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[cameraId]->supported_antibandings[i]); 19710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 19720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_antibanding_modes[size] = (uint8_t)val; 19730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 19740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 19750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 1976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 1978662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_antibanding_modes, 19790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1980662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 198147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX]; 19820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1983662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) { 19840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FOCUS_MODES_MAP, 1985b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 19860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_focus_modes[i]); 19870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 19880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_af_modes[size] = (uint8_t)val; 19890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 19900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1991662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1992662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 1993662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_af_modes, 19940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1995662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 199647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_awb_modes[CAM_WB_MODE_MAX]; 19970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1998662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) { 19990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP, 2000b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 20010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_white_balances[i]); 20020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 20030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_awb_modes[size] = (uint8_t)val; 20040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 20050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2006662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2007662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 2008662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_awb_modes, 20090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2010662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 201147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_flash_modes[CAM_FLASH_MODE_MAX]; 20120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 2013662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) { 20140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FLASH_MODES_MAP, 2015b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FLASH_MODES_MAP)/sizeof(FLASH_MODES_MAP[0]), 20160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_flash_modes[i]); 20170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 20180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_flash_modes[size] = (uint8_t)val; 20190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 20200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2021662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2022e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t flashAvailable = 0; 2023e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (size > 1) { 2024e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang //flash is supported 2025e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang flashAvailable = 1; 2026e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2027662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_FLASH_MODE, 2028662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_flash_modes, 20290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2030662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2031e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE, 2032e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang &flashAvailable, 1); 2033e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2034e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t avail_ae_modes[5]; 2035e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size = 0; 2036e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) { 2037e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i]; 2038e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size++; 2039e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2040e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (flashAvailable) { 2041e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; 2042e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; 2043e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; 2044e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2045662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 2046662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_ae_modes, 2047e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size); 2048ea44a483c0e98200c058a85ea339457616516847Zhijun He 2049e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t sensitivity_range[2]; 2050e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity; 2051e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity; 2052ea44a483c0e98200c058a85ea339457616516847Zhijun He staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, 2053ea44a483c0e98200c058a85ea339457616516847Zhijun He sensitivity_range, 2054ea44a483c0e98200c058a85ea339457616516847Zhijun He sizeof(sensitivity_range) / sizeof(int32_t)); 20552dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 205673c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, 205773c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy &gCamCapability[cameraId]->max_analog_sensitivity, 205873c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy sizeof(int32_t) ); 205973c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 2060e936796df0426c326d043c2359c149024526f4bcShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 2061e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 206273c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy 2063b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang gStaticMetadata[cameraId] = staticInfo.release(); 2064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2068662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : makeTable 2069662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2070662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes 2071662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2072662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2073662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2074662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2075662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2076662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size, 2077662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t* sizeTable) 2078662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2079662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int j = 0; 2080662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < size; i++) { 2081662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j] = dimTable[i].width; 2082662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j+1] = dimTable[i].height; 2083662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole j+=2; 2084662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2085662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 20860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 20870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*=========================================================================== 20880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : makeFPSTable 20890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 20900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges 20910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 20920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS : 20930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 20940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/ 20950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size, 2096c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang int32_t* fpsRangesTable) 20970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{ 20980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int j = 0; 20990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < size; i++) { 2100c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps; 2101c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps; 21020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole j+=2; 21030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 21040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole} 21052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 21062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*=========================================================================== 21072dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION : makeOverridesList 21082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 21092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides 21102dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 21112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS : 21122dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 21132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 21142dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/ 21152dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable, 2116e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t size, uint8_t* overridesList, 21179443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t* supported_indexes, 21189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int camera_id) 21192dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{ 21202dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*daemon will give a list of overrides for all scene modes. 21212dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang However we should send the fwk only the overrides for the scene modes 21222dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported by the framework*/ 21239443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int j = 0, index = 0, supt = 0; 21249443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t focus_override; 21252dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang for (int i = 0; i < size; i++) { 21269443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 0; 2127e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang index = supported_indexes[i]; 21289443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j] = (uint8_t)overridesTable[index].ae_mode; 21299443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP, 21309443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 21319443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesTable[index].awb_mode); 21329443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override = (uint8_t)overridesTable[index].af_mode; 21339443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) { 21349443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) { 21359443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 1; 21369443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab break; 21379443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 21389443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 21399443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (supt) { 21409443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP, 21419443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 21429443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override); 21439443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } else { 21449443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF; 21459443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 21462dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang j+=3; 21472dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang } 21482dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang} 21492dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2150662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2151662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : getPreviewHalPixelFormat 2152662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2153662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework 2154662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2155662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend 2156662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2157662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN : format recognized by framework 2158662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2159662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2160662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format) 2161662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2162662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t halPixelFormat; 2163662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2164662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole switch (format) { 2165662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV12: 2166662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; 2167662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2168662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21: 2169662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2170662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2171662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21_ADRENO: 2172662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO; 2173662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2174662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_YV12: 2175662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YV12; 2176662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2177662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV16: 2178662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV61: 2179662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole default: 2180662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2181662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2182662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2183662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return halPixelFormat; 2184662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2185662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2186662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 21873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION : getSensorSensitivity 21883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 21893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value 21903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 21913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor 21923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 21933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN : sensitivity supported by sensor 21943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 21953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/ 21963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode) 21973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{ 21983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang int32_t sensitivity; 21993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 22003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang switch (iso_mode) { 22013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_100: 22023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 100; 22033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 22043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_200: 22053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 200; 22063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 22073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_400: 22083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 400; 22093fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 22103fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_800: 22113fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 800; 22123fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 22133fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_1600: 22143fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 1600; 22153fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 22163fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang default: 22173fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = -1; 22183fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 22193fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 22203fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang return sensitivity; 22213fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang} 22223fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 22233fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 22243fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*=========================================================================== 2225662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : AddSetParmEntryToBatch 2226662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2227662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch 2228662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2229662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2230662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @p_table : ptr to parameter buffer 2231662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramType : parameter type 2232662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramLength : length of parameter value 2233662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramValue : ptr to parameter value 2234662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2235662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2236662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 2237662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2238662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2239662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table, 2240662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole cam_intf_parm_type_t paramType, 2241662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint32_t paramLength, 2242662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole void *paramValue) 2243662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2244662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int position = paramType; 2245662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int current, next; 2246662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2247662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2248662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Code to take care of linking next flags * 2249662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2250662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_FIRST_PARAM_ID(p_table); 2251662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position == current){ 2252662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //DO NOTHING 2253662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else if (position < current){ 2254662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, current); 2255662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_FIRST_PARAM_ID(p_table, position); 2256662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 2257662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /* Search for the position in the linked list where we need to slot in*/ 2258662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole while (position > GET_NEXT_PARAM_ID(current, p_table)) 2259662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_NEXT_PARAM_ID(current, p_table); 2260662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2261662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*If node already exists no need to alter linking*/ 2262662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position != GET_NEXT_PARAM_ID(current, p_table)) { 2263662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole next = GET_NEXT_PARAM_ID(current, p_table); 2264662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(current, p_table, position); 2265662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, next); 2266662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2267662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2268662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2269662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2270662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Copy contents into entry * 2271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2272662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2273662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (paramLength > sizeof(parm_type_t)) { 2274662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:Size of input larger than max entry size",__func__); 2275662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2276662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2277662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength); 2278662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NO_ERROR; 2279662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2280662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2281662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2282662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupFwkName 2283662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2284662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2285662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2286662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2288662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2289662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2290662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @hal_name : name of the hal_parm to map 2291662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2292662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int type of status 2293662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * fwk_name -- success 2294662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2295662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 22960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[], 2297662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int hal_name) 2298662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2299662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2300d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (int i = 0; i < len; i++) { 2301d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang if (arr[i].hal_name == hal_name) 2302d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return arr[i].fwk_name; 2303662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2304d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 2305d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* Not able to find matching framework type is not necessarily 2306d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * an error case. This happens when mm-camera supports more attributes 2307d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * than the frameworks do */ 2308d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Cannot find matching framework type", __func__); 2309d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return NAME_NOT_FOUND; 2310662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2311662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2312662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2313662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupHalName 2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2316662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2318662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2319662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2320662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2321662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @fwk_name : name of the hal_parm to map 2322662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2323662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2324662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * hal_name -- success 2325662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2326662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 23270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[], 2328662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int fwk_name) 2329662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2330662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 2331662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].fwk_name == fwk_name) 2332662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].hal_name; 2333662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 23340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Cannot find matching hal type", __func__); 2335662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NAME_NOT_FOUND; 2336662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2337662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2338662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 2340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 2342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 2346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 2349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 2350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 2352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 2353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 2355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 2357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 2358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 2360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2364b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang if (NULL == gStaticMetadata[cameraId]) { 2365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 2366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 2372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 2373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 2374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 2377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 2378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 2382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 2383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 2388e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0); 2389b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang info->static_camera_characteristics = gStaticMetadata[cameraId]; 2390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 2396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 2398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 2400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 2403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 2404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 240697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type) 2407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2408e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 2409e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 2411e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 2415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 241697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata settings; 2417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 2418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 2419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 2420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 2422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 2424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 2425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 2426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 2427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 2429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 2430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 2432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 2433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 2435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 2436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 2438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 2439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 2442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 2445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 24469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 24479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 2448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 2450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 2451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 2453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 2454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 2456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 2457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 2459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 2460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 2462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 2463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 2465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 2466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2467e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t focusMode; 2468e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) { 2469e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to auto", __func__); 2470e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_AUTO; 2471e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2472e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to off", __func__); 2473e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_OFF; 2474e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 24752dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1); 24762dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 24772dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; 24782dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 24792dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 2481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 2482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 2483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 248647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_aperture = gCamCapability[mCameraId]->apertures[0]; 2487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 2488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2489b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang if (gCamCapability[mCameraId]->filter_densities_count) { 249047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 2491b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 2492b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[mCameraId]->filter_densities_count); 2493b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang } 2494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 24959a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang float default_focal_length = gCamCapability[mCameraId]->focal_length; 24969a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 2497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 2499e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2500e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 250580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 250680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 250780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 250880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 250980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 251080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 251180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 251280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 251380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 251480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 251580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 251680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 2517662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id, 2518662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const camera_metadata_t *settings) 251980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 252080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 252180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 252233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (settings == NULL && mFirstRequest) { 252380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 252480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 2525662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 252633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2527b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 2528b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang 2529b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 253033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 2531b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 2532b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(hal_version), &hal_version); 253333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2534662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*we need to update the frame number in the parameters*/ 2535662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 2536662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(frame_id), &frame_id); 2537662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (rc < 0) { 2538662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s: Failed to set the frame number in the parameters", __func__); 2539662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2540662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 25410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2542662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(settings != NULL){ 25431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = translateMetadataToParameters(settings); 254480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 254580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 2546662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 254780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 254880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 254980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 255080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 255180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 255280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 255380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 255480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 255580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 255680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 255780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 255880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 255980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 256080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 256180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 256280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 256380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 256480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (const camera_metadata_t *settings) 256580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 2566662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 256797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata frame_settings; 2568662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole frame_settings = settings; 2569662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 25700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) { 25720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t antibandingMode = 25730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0]; 25740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING, 25750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(antibandingMode), &antibandingMode); 25760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 257797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 257853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 2579e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t expCompensation = frame_settings.find( 2580e936796df0426c326d043c2359c149024526f4bcShuzhen Wang ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 2581e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (expCompensation < gCamCapability[mCameraId]->exposure_time_range[0]) 2582e936796df0426c326d043c2359c149024526f4bcShuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_time_range[0]; 2583e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (expCompensation > gCamCapability[mCameraId]->exposure_time_range[1]) 2584e936796df0426c326d043c2359c149024526f4bcShuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_time_range[1]; 258553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION, 258653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab sizeof(expCompensation), &expCompensation); 258753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 258853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab 25890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) { 25900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0]; 25910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK, 25920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeLock), &aeLock); 25930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) { 25950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_fps_range_t fps_range; 25960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.min_fps = 25970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 25980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.max_fps = 25999443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1]; 26000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE, 26010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(fps_range), &fps_range); 26020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 260397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 26042b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang float focalDistance = -1.0; 26052b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) { 26062b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0]; 26072b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 26082b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang CAM_INTF_META_LENS_FOCUS_DISTANCE, 26092b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang sizeof(focalDistance), &focalDistance); 26102b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } 26112b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang 26120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) { 26132dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang uint8_t fwk_focusMode = 26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0]; 26152b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang uint8_t focusMode; 26162b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) { 26172b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focusMode = CAM_FOCUS_MODE_INFINITY; 26182b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } else{ 26192b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focusMode = lookupHalName(FOCUS_MODES_MAP, 26202b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang sizeof(FOCUS_MODES_MAP), 26212b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang fwk_focusMode); 26222b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } 26230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE, 26240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focusMode), &focusMode); 26250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 26270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) { 26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t awbLock = 26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0]; 26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK, 26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(awbLock), &awbLock); 26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) { 26350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_whiteLevel = 26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0]; 26370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP, 26380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(WHITE_BALANCE_MODES_MAP), 26390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_whiteLevel); 26400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE, 26410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(whiteLevel), &whiteLevel); 26420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) { 26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_effectMode = 26460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0]; 26470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP, 26480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(EFFECT_MODES_MAP), 26490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_effectMode); 26500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT, 26510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(effectMode), &effectMode); 26520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 26550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_aeMode = 26560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 2657e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t aeMode; 2658e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t redeye; 26596356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani 2660e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) { 2661e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_OFF; 2662e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2663e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_ON; 2664e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2665e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 2666e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 1; 2667e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2668e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 0; 2669e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 26706356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani 2671e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP, 2672e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(AE_FLASH_MODE_MAP), 2673f7d51831acde505c8cda8e60ab651b113326c6b7Shuzhen Wang fwk_aeMode); 26740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE, 26750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeMode), &aeMode); 2676e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 2677e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(flashMode), &flashMode); 2678e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION, 2679e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(redeye), &redeye); 26800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) { 26830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t colorCorrectMode = 26840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0]; 26850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = 26860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE, 26870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(colorCorrectMode), &colorCorrectMode); 26880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2689e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang cam_trigger_t aecTrigger; 2690e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE; 2691e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger_id = -1; 26922dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&& 26932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) { 26942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger = 26950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0]; 26962dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger_id = 26972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0]; 26980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, 27001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(aecTrigger), &aecTrigger); 27010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27022dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*af_trigger must come with a trigger id*/ 27032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) && 27042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) { 27052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang cam_trigger_t af_trigger; 27062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger = 27070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0]; 27082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger_id = 27092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0]; 27100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 27112dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger); 27120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_MODE)) { 27150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0]; 27160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE, 27170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(metaMode), &metaMode); 27189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) { 27199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0]; 27209443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP, 27219443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 27229443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab fwk_sceneMode); 27239443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 2724827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab sizeof(sceneMode), &sceneMode); 2725827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab } else if (metaMode == ANDROID_CONTROL_MODE_OFF) { 2726827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 2727827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 2728827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab sizeof(sceneMode), &sceneMode); 2729827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) { 2730827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 2731827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 27329443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(sceneMode), &sceneMode); 27339443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 27340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) { 27370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t demosaic = 27380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0]; 27390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC, 27400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(demosaic), &demosaic); 27410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_MODE)) { 27440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 27450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE, 27460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(edgeMode), &edgeMode); 27470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) { 27500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t edgeStrength = 27510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0]; 27520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 27530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength); 27540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2756e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (frame_settings.exists(ANDROID_FLASH_MODE)) { 27576356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani int32_t respectFlashMode = 1; 27586356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 27596356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t fwk_aeMode = 27606356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 27616356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) { 27626356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani respectFlashMode = 0; 27636356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: AE Mode controls flash, ignore android.flash.mode", 27646356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani __func__); 27656356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 27666356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 27676356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (respectFlashMode) { 27686356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t flashMode = 27696356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_FLASH_MODE).data.u8[0]; 27706356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP, 27716356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(FLASH_MODES_MAP), 27726356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode); 27736356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: flash mode after mapping %d", __func__, flashMode); 27746356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani // To check: CAM_INTF_META_FLASH_MODE usage 27756356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 27766356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(flashMode), &flashMode); 27776356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 2778e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2779e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 27800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) { 27810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t flashPower = 27820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0]; 27830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER, 27840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(flashPower), &flashPower); 27850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) { 27880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t flashFiringTime = 27890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0]; 27900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 27910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime); 27920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) { 27950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t geometricMode = 27960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0]; 27970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE, 27980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricMode), &geometricMode); 27990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) { 28028867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t geometricStrength = 28030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0]; 28040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 28050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_GEOMETRIC_STRENGTH, 28060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricStrength), &geometricStrength); 28070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) { 28100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t hotPixelMode = 28110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0]; 28120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE, 28130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(hotPixelMode), &hotPixelMode); 28140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_APERTURE)) { 28170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float lensAperture = 28180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find( ANDROID_LENS_APERTURE).data.f[0]; 28190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE, 28200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(lensAperture), &lensAperture); 28210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) { 28240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float filterDensity = 28250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0]; 28260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY, 28270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(filterDensity), &filterDensity); 28280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 28310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float focalLength = 28320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 28330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 28340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_FOCAL_LENGTH, 28350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focalLength), &focalLength); 28360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) { 28390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t optStabMode = 28400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0]; 28418867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 28420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_OPT_STAB_MODE, 28430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(optStabMode), &optStabMode); 28440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) { 28470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedMode = 28480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]; 28498867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 28500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_MODE, 28510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedMode), &noiseRedMode); 28520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) { 28550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedStrength = 28560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0]; 28578867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 28580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_STRENGTH, 28590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedStrength), &noiseRedStrength); 28600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 286271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang cam_crop_region_t scalerCropRegion; 286371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool scalerCropSet = false; 28640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) { 28650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.left = 28660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0]; 28670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.top = 28680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1]; 28690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.width = 28700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2]; 287147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang scalerCropRegion.height = 287247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3]; 28730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 28740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SCALER_CROP_REGION, 28750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(scalerCropRegion), &scalerCropRegion); 287671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropSet = true; 28770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { 28800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorExpTime = 28810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0]; 28820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 28830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_EXPOSURE_TIME, 28840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorExpTime), &sensorExpTime); 28850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) { 28880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorFrameDuration = 28890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0]; 2890e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration) 2891e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration; 28920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 28930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_FRAME_DURATION, 28940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorFrameDuration), &sensorFrameDuration); 28950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 28980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t sensorSensitivity = 28990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 2900e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity < 2901e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity) 2902e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 2903e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity; 2904e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity > 2905e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity) 2906e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 2907e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity; 29080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 29090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_SENSITIVITY, 29100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorSensitivity), &sensorSensitivity); 29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_MODE)) { 29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t shadingMode = 29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_MODE).data.u8[0]; 29160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE, 29170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingMode), &shadingMode); 29180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) { 29210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t shadingStrength = 29220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0]; 29230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH, 29240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingStrength), &shadingStrength); 29250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) { 29280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t facedetectMode = 29290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0]; 29300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 29310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_FACEDETECT_MODE, 29320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(facedetectMode), &facedetectMode); 29330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) { 29360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t histogramMode = 29370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0]; 29380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 29390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_HISTOGRAM_MODE, 29400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(histogramMode), &histogramMode); 29410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) { 29440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t sharpnessMapMode = 29450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0]; 29460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 29470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, 29480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sharpnessMapMode), &sharpnessMapMode); 29490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_TONEMAP_MODE)) { 29520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t tonemapMode = 29530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0]; 29540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 29550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_TONEMAP_MODE, 29560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(tonemapMode), &tonemapMode); 29570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 29600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t captureIntent = 29610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 29620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 29630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(captureIntent), &captureIntent); 29640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 296659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) { 296759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 296871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 296959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertFromRegions(&roi, settings, ANDROID_CONTROL_AE_REGIONS); 297071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 297171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 297271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 297371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 297471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI, 297571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 297671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 297759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 297859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 297959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) { 298059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 298171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 298259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertFromRegions(&roi, settings, ANDROID_CONTROL_AF_REGIONS); 298371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 298471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 298571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 298671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 298771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI, 298871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 298971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 299059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 299159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 299259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) { 299359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 299471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 299559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertFromRegions(&roi, settings, ANDROID_CONTROL_AWB_REGIONS); 299671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 299771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 299871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 299971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 300071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS, 300171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 300271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 300359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 3004662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 3005662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 3006662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 3007662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 30080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : getJpegSettings 3009662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 30100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL 3011662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3013662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 3014662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @settings : frame settings information from framework 3015662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3016662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3017662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : success: NO_ERROR 3018662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * failure: 3019662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 3020662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings 3021662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (const camera_metadata_t *settings) 3022662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 3023662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (mJpegSettings) { 30249a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_timestamp) { 30259a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_timestamp); 30269a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 30279a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 30289a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_coordinates) { 30299a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 30309a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_coordinates[i]); 30319a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 30329a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 30339a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 3034662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole free(mJpegSettings); 3035662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = NULL; 3036662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 3037662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t)); 303897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata jpeg_settings; 3039662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings = settings; 3040662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 30410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) { 30420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 30430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0]; 30440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 30450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 0; 30460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) { 30480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_quality = 30490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0]; 30500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 30511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mJpegSettings->jpeg_quality = 85; 30520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) { 30540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.width = 30550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0]; 30560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.height = 30570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1]; 30580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 305908ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.width = 0; 306008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.height = 0; 30610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) { 30630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < 3; i++) { 30649a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*)); 30659a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_coordinates[i]) = 30660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i]; 30670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30683fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else{ 30699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 30709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 30713fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 30720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 30740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { 30759a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*)); 30769a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_timestamp) = 30770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0]; 30789a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 30799a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 30800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { 30839a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count; 30849a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < len; i++) { 30859a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[i] = 30869a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i]; 30879a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 30889a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_processing_method[len-1] != '\0') { 30899a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[len] = '\0'; 30909a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 30919a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 30929a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[0] = '\0'; 30930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 30950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 30960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->sensor_sensitivity = 30970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 30983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else { 30993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed; 31000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 31019a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 31020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 31030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->lens_focal_length = 31040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 31050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 310653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 310753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_compensation = 310853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 310953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 311053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step; 31110a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab mJpegSettings->max_jpeg_size = calcMaxJpegSize(); 31127ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->is_jpeg_format = true; 31137ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask; 311480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 311580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 311680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 311780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 3118e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 3119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 3121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 3124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 3125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 3126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 3128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 31291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata, 3130e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, 3131e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frame_number, void *userdata) 3132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 3134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 3135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 3136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3139e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->captureResultCb(metadata, buffer, frame_number); 3140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 31437ee407aa1024789089aad411c372c79423699976Ajay Dudani 3144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 3146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 3148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 3153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 3154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 3157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 3158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3159d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 31671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->initialize(callback_ops); 3168d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 31691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 3174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 3181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 3182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 3183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 3186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 3188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3189d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 31961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->configureStreams(stream_list); 3197d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 31981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 3203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 3205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 3211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 3213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3214d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 32211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->registerStreamBuffers(buffer_set); 3222d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 32231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 3228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 3230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 3235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 3236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 32379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 32389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 32399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 3240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3242d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 3244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 3249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 325197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole fwk_metadata = hw->translateCapabilityToMetadata(type); 3252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3253d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 3255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 3259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 32679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 32689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 32699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 3270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3271d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 327280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 327380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 327480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 327580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 32769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 327780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 32789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 32791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->processCaptureRequest(request); 3280d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 32811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 3286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3295e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops( 3296e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, 3297e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang vendor_tag_query_ops_t* ops) 3298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3299d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3300e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3301e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3302e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3303e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3304e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3305e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3306e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3307e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->getMetadataVendorTagOps(ops); 3308d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3309e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 3314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3323e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump( 3324e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, int fd) 3325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3326d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3327e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3328e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3329e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3330e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3331e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3332e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3333e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3334e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->dump(fd); 3335d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3336e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3339e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 3340e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : close_camera_device 3341e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3342e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 3343e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3344e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 3345e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3346e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3347e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 3348e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 3349e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 3350e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 3351d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3352e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int ret = NO_ERROR; 3353e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3354e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>( 3355e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<camera3_device_t *>(device)->priv); 3356e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3357e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("NULL camera device"); 3358e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return BAD_VALUE; 3359e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3360e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete hw; 3361cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 3362cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 3363cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 0; 3364cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 3365d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3366e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return ret; 3367e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 3368e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 33697ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 33707ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : getWaveletDenoiseProcessPlate 33717ee407aa1024789089aad411c372c79423699976Ajay Dudani * 33727ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: query wavelet denoise process plate 33737ee407aa1024789089aad411c372c79423699976Ajay Dudani * 33747ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : None 33757ee407aa1024789089aad411c372c79423699976Ajay Dudani * 33767ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : WNR prcocess plate vlaue 33777ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 33787ee407aa1024789089aad411c372c79423699976Ajay Dudanicam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate() 33797ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 33807ee407aa1024789089aad411c372c79423699976Ajay Dudani char prop[PROPERTY_VALUE_MAX]; 33817ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(prop, 0, sizeof(prop)); 33827ee407aa1024789089aad411c372c79423699976Ajay Dudani property_get("persist.denoise.process.plates", prop, "0"); 33837ee407aa1024789089aad411c372c79423699976Ajay Dudani int processPlate = atoi(prop); 33847ee407aa1024789089aad411c372c79423699976Ajay Dudani switch(processPlate) { 33857ee407aa1024789089aad411c372c79423699976Ajay Dudani case 0: 33867ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_YCBCR_PLANE; 33877ee407aa1024789089aad411c372c79423699976Ajay Dudani case 1: 33887ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_CBCR_ONLY; 33897ee407aa1024789089aad411c372c79423699976Ajay Dudani case 2: 33907ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 33917ee407aa1024789089aad411c372c79423699976Ajay Dudani case 3: 33927ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINED_CBCR; 33937ee407aa1024789089aad411c372c79423699976Ajay Dudani default: 33947ee407aa1024789089aad411c372c79423699976Ajay Dudani return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR; 33957ee407aa1024789089aad411c372c79423699976Ajay Dudani } 33967ee407aa1024789089aad411c372c79423699976Ajay Dudani} 33977ee407aa1024789089aad411c372c79423699976Ajay Dudani 33987ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 33997ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : needRotationReprocess 34007ee407aa1024789089aad411c372c79423699976Ajay Dudani * 34017ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if rotation needs to be done by reprocess in pp 34027ee407aa1024789089aad411c372c79423699976Ajay Dudani * 34037ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 34047ee407aa1024789089aad411c372c79423699976Ajay Dudani * 34057ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : true: needed 34067ee407aa1024789089aad411c372c79423699976Ajay Dudani * false: no need 34077ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 34087ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needRotationReprocess() 34097ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 34107ee407aa1024789089aad411c372c79423699976Ajay Dudani // TODO: hack here to return false to avoid reprocess 34117ee407aa1024789089aad411c372c79423699976Ajay Dudani // Need to be enabled after PP is enabled 34127ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 34137ee407aa1024789089aad411c372c79423699976Ajay Dudani 34147ee407aa1024789089aad411c372c79423699976Ajay Dudani if (!mJpegSettings->is_jpeg_format) { 34157ee407aa1024789089aad411c372c79423699976Ajay Dudani // RAW image, no need to reprocess 34167ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 34177ee407aa1024789089aad411c372c79423699976Ajay Dudani } 34187ee407aa1024789089aad411c372c79423699976Ajay Dudani 34197ee407aa1024789089aad411c372c79423699976Ajay Dudani if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 && 34207ee407aa1024789089aad411c372c79423699976Ajay Dudani mJpegSettings->jpeg_orientation > 0) { 34217ee407aa1024789089aad411c372c79423699976Ajay Dudani // current rotation is not zero, and pp has the capability to process rotation 34227ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGD("%s: need do reprocess for rotation", __func__); 34237ee407aa1024789089aad411c372c79423699976Ajay Dudani return true; 34247ee407aa1024789089aad411c372c79423699976Ajay Dudani } 34257ee407aa1024789089aad411c372c79423699976Ajay Dudani 34267ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 34277ee407aa1024789089aad411c372c79423699976Ajay Dudani} 34287ee407aa1024789089aad411c372c79423699976Ajay Dudani 34297ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 34307ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : addOnlineReprocChannel 34317ee407aa1024789089aad411c372c79423699976Ajay Dudani * 34327ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add a online reprocess channel that will do reprocess on frames 34337ee407aa1024789089aad411c372c79423699976Ajay Dudani * coming from input channel 34347ee407aa1024789089aad411c372c79423699976Ajay Dudani * 34357ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 34367ee407aa1024789089aad411c372c79423699976Ajay Dudani * @pInputChannel : ptr to input channel whose frames will be post-processed 34377ee407aa1024789089aad411c372c79423699976Ajay Dudani * 34387ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : Ptr to the newly created channel obj. NULL if failed. 34397ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 34407ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel( 34417ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle) 34427ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 34437ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t rc = NO_ERROR; 34447ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3ReprocessChannel *pChannel = NULL; 34457ee407aa1024789089aad411c372c79423699976Ajay Dudani if (pInputChannel == NULL) { 34467ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: input channel obj is NULL", __func__); 34477ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 34487ee407aa1024789089aad411c372c79423699976Ajay Dudani } 34497ee407aa1024789089aad411c372c79423699976Ajay Dudani 34507ee407aa1024789089aad411c372c79423699976Ajay Dudani pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle, 34517ee407aa1024789089aad411c372c79423699976Ajay Dudani mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle); 34527ee407aa1024789089aad411c372c79423699976Ajay Dudani if (NULL == pChannel) { 34537ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: no mem for reprocess channel", __func__); 34547ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 34557ee407aa1024789089aad411c372c79423699976Ajay Dudani } 34567ee407aa1024789089aad411c372c79423699976Ajay Dudani 34577ee407aa1024789089aad411c372c79423699976Ajay Dudani // Capture channel, only need snapshot and postview streams start together 34587ee407aa1024789089aad411c372c79423699976Ajay Dudani mm_camera_channel_attr_t attr; 34597ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 34607ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 34617ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue(); 34627ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->initialize(); 34637ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 34647ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc); 34657ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 34667ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 34677ee407aa1024789089aad411c372c79423699976Ajay Dudani } 34687ee407aa1024789089aad411c372c79423699976Ajay Dudani 34697ee407aa1024789089aad411c372c79423699976Ajay Dudani // pp feature config 34707ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_pp_feature_config_t pp_config; 34717ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&pp_config, 0, sizeof(cam_pp_feature_config_t)); 34727ee407aa1024789089aad411c372c79423699976Ajay Dudani if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) { 34737ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS; 34747ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.sharpness = 10; 34757ee407aa1024789089aad411c372c79423699976Ajay Dudani } 34767ee407aa1024789089aad411c372c79423699976Ajay Dudani 34777ee407aa1024789089aad411c372c79423699976Ajay Dudani if (isWNREnabled()) { 34787ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D; 34797ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.denoise_enable = 1; 34807ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate(); 34817ee407aa1024789089aad411c372c79423699976Ajay Dudani } 34827ee407aa1024789089aad411c372c79423699976Ajay Dudani if (needRotationReprocess()) { 34837ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION; 34847ee407aa1024789089aad411c372c79423699976Ajay Dudani int rotation = mJpegSettings->jpeg_orientation; 34857ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rotation == 0) { 34867ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_0; 34877ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 90) { 34887ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_90; 34897ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 180) { 34907ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_180; 34917ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (rotation == 270) { 34927ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_config.rotation = ROTATE_270; 34937ee407aa1024789089aad411c372c79423699976Ajay Dudani } 34947ee407aa1024789089aad411c372c79423699976Ajay Dudani } 34957ee407aa1024789089aad411c372c79423699976Ajay Dudani 34967ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pChannel->addReprocStreamsFromSource(pp_config, 34977ee407aa1024789089aad411c372c79423699976Ajay Dudani pInputChannel, 34987ee407aa1024789089aad411c372c79423699976Ajay Dudani mMetadataChannel); 34997ee407aa1024789089aad411c372c79423699976Ajay Dudani 35007ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 35017ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pChannel; 35027ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 35037ee407aa1024789089aad411c372c79423699976Ajay Dudani } 35047ee407aa1024789089aad411c372c79423699976Ajay Dudani return pChannel; 35057ee407aa1024789089aad411c372c79423699976Ajay Dudani} 35067ee407aa1024789089aad411c372c79423699976Ajay Dudani 35077ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 35087ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : needReprocess 35097ee407aa1024789089aad411c372c79423699976Ajay Dudani * 35107ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: if reprocess is needed 35117ee407aa1024789089aad411c372c79423699976Ajay Dudani * 35127ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 35137ee407aa1024789089aad411c372c79423699976Ajay Dudani * 35147ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : true: needed 35157ee407aa1024789089aad411c372c79423699976Ajay Dudani * false: no need 35167ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 35177ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3HardwareInterface::needReprocess() 35187ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 35197ee407aa1024789089aad411c372c79423699976Ajay Dudani // TODO: hack here to return false to avoid reprocess 35207ee407aa1024789089aad411c372c79423699976Ajay Dudani // Need to be enabled after PP is enabled 35217ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 35227ee407aa1024789089aad411c372c79423699976Ajay Dudani 35237ee407aa1024789089aad411c372c79423699976Ajay Dudani if (!mJpegSettings->is_jpeg_format) { 35247ee407aa1024789089aad411c372c79423699976Ajay Dudani // RAW image, no need to reprocess 35257ee407aa1024789089aad411c372c79423699976Ajay Dudani return false; 35267ee407aa1024789089aad411c372c79423699976Ajay Dudani } 35277ee407aa1024789089aad411c372c79423699976Ajay Dudani 35287ee407aa1024789089aad411c372c79423699976Ajay Dudani if (((gCamCapability[mCameraId]->min_required_pp_mask > 0) || 35297ee407aa1024789089aad411c372c79423699976Ajay Dudani isWNREnabled())) { 35307ee407aa1024789089aad411c372c79423699976Ajay Dudani // TODO: add for ZSL HDR later 35317ee407aa1024789089aad411c372c79423699976Ajay Dudani // pp module has min requirement for zsl reprocess, or WNR in ZSL mode 35327ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__); 35337ee407aa1024789089aad411c372c79423699976Ajay Dudani return true; 35347ee407aa1024789089aad411c372c79423699976Ajay Dudani } 35357ee407aa1024789089aad411c372c79423699976Ajay Dudani 35367ee407aa1024789089aad411c372c79423699976Ajay Dudani return needRotationReprocess(); 35377ee407aa1024789089aad411c372c79423699976Ajay Dudani} 35387ee407aa1024789089aad411c372c79423699976Ajay Dudani 35397ee407aa1024789089aad411c372c79423699976Ajay Dudaniint QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue() 35407ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 35417ee407aa1024789089aad411c372c79423699976Ajay Dudani return gCamCapability[mCameraId]->min_num_pp_bufs; 35427ee407aa1024789089aad411c372c79423699976Ajay Dudani} 35437ee407aa1024789089aad411c372c79423699976Ajay Dudani 3544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 3545