QCamera3HWI.cpp revision 6356e2d4fc01ff878ac4664d86892c8d81e330a9
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), 16133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest(false), 16233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap(NULL), 16333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters(NULL), 16499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan mJpegSettings(NULL), 1658bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode(false), 16699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule(NULL) 167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 169e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0; 170e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.close = close_camera_device; 171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.ops = &mCameraOps; 172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.priv = this; 173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->version = CAM_HAL_V3; 1749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_init(&mRequestCond, NULL); 1769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 17774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = -1; 178e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_init(&mMutex, NULL); 17933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 18033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 18133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mDefaultMetadata[i] = NULL; 18299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan 18399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 18499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) { 18599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID); 18699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 18799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 19366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface 194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 201d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 202d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* We need to stop all streams before deleting any stream */ 2031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 2041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 2051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 206dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (channel) 207dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang channel->stop(); 208d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang } 209d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 210d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang it != mStreamInfo.end(); it++) { 211d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 212dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (channel) 213dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang delete channel; 2141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free (*it); 2151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 2161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 21797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (mJpegSettings != NULL) { 21897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole free(mJpegSettings); 21997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mJpegSettings = NULL; 22097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 221dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 222dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang /* Clean up all channels */ 223dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang if (mCameraInitialized) { 224d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani mMetadataChannel->stop(); 225d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani delete mMetadataChannel; 226d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani mMetadataChannel = NULL; 227dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang deinitParameters(); 228dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang } 229dbeda6fde21ef974c09a2a8a89c6729f1873f660Shuzhen Wang 230cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraOpened) 231cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang closeCamera(); 232e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 23333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 23433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (mDefaultMetadata[i]) 23533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang free_camera_metadata(mDefaultMetadata[i]); 23633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 237e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_cond_destroy(&mRequestCond); 238e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 239e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mMutex); 240d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 258cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 259cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (mCameraSessionActive) { 260cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang ALOGE("%s: multiple simultaneous camera instance not supported", __func__); 261cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 262cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang return INVALID_OPERATION; 263cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } 264cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 271cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang if (rc == 0) { 272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 273cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 1; 274cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang } else 275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 276cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 27799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 27899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == 0) { 27999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 28099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 28199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 28299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=1"); 28399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 28499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 28599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 28699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 287cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 33899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#ifdef HAS_MULTIMEDIA_HINTS 33999119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (rc == NO_ERROR) { 34099119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule) { 34199119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan if (m_pPowerModule->powerHint) { 34299119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, 34399119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan (void *)"state=0"); 34499119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 34599119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 34699119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan } 34799119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan#endif 34899119ea1812fef51559a48bff4be66624cc55b0dMekala Natarajan 349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 368e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 369e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 37033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang rc = initParameters(); 37133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (rc < 0) { 37233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang ALOGE("%s: initParamters failed %d", __func__, rc); 37333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang goto err1; 37433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } 375d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani //Create metadata channel and initialize it 376d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 377d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani mCameraHandle->ops, captureResultCb, 378d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani &gCamCapability[mCameraId]->padding_info, this); 379d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani if (mMetadataChannel == NULL) { 380d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani ALOGE("%s: failed to allocate metadata channel", __func__); 381d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani rc = -ENOMEM; 382d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani goto err2; 383d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani } 384d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani rc = mMetadataChannel->initialize(); 385d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani if (rc < 0) { 386d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani ALOGE("%s: metadata channel initialization failed", __func__); 387d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani goto err3; 388d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani } 389d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani 3909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCallbackOps = callback_ops; 391e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 392e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 393cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraInitialized = true; 3949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 3959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 396d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudanierr3: 397d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani delete mMetadataChannel; 398d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani mMetadataChannel = NULL; 399d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudanierr2: 400d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani deinitParameters(); 4019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1: 402e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 4039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 42133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int rc = 0; 4220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_lock(&mMutex); 423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 426e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 432e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 439e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *inputStream = NULL; 444c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang camera3_stream_t *jpegStream = NULL; 4450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /* first invalidate all the steams in the mStreamList 4460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * if they appear again, they will be validated */ 4471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 449d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 450d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang channel->stop(); 4510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = INVALID; 4520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 453d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 456c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGV("%s: newStream type = %d, stream format = %d stream size : %d x %d", 457c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, newStream->stream_type, newStream->format, 458c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang newStream->width, newStream->height); 4590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //if the stream is in the mStreamList validate it 4600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole bool stream_exists = false; 4611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 4630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if ((*it)->stream == newStream) { 4641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = 4651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (QCamera3Channel*)(*it)->stream->priv; 4660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_exists = true; 4670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = RECONFIGURE; 4681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*delete the channel object associated with the stream because 4691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole we need to reconfigure*/ 4701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 4711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->stream->priv = NULL; 4720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (!stream_exists) { 4750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //new stream 4760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info_t* stream_info; 4770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info = (stream_info_t* )malloc(sizeof(stream_info_t)); 4780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->stream = newStream; 4790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->status = VALID; 4801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole stream_info->registered = 0; 4810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mStreamInfo.push_back(stream_info); 4820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 483c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT 484c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) { 485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 487e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 489625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 490625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 491625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 492c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->format == HAL_PIXEL_FORMAT_BLOB) { 493c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream = newStream; 494c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 496625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 4980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /*clean up invalid streams*/ 4991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 5001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end();) { 5010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if(((*it)->status) == INVALID){ 5021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 5031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 5040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole delete[] (buffer_handle_t*)(*it)->buffer_set.buffers; 5050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole free(*it); 5061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it = mStreamInfo.erase(it); 5071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 5081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it++; 5090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 511625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 512d97e494db5f2842765083f1295a61bbad3e7cfcdAjay Dudani //mMetadataChannel->stop(); 513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 520f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_INPUT: 521f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 522f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 523f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_BIDIRECTIONAL: 524f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 525f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab GRALLOC_USAGE_HW_CAMERA_WRITE; 526f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 527f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_OUTPUT: 528f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 529f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 530f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 531f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 532f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 533625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 5361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 539f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 5408867984d33ed870071109a4500402dddbc85c048Shuzhen Wang case HAL_PIXEL_FORMAT_YCbCr_420_888: 541f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 542c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL && 543c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpegStream) { 544c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t width = jpegStream->width; 545c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t height = jpegStream->height; 5468bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani mIsZslMode = true; 547c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 548c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mCameraHandle->ops, captureResultCb, 549c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this, newStream, 550c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang width, height); 551c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else 552c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 553f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 554f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 555f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 556f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 557f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 558f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 559f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 560f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 561f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 562f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 563f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_BLOB: 564f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 565f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab channel = new QCamera3PicChannel(mCameraHandle->camera_handle, 566f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 567f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 568f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 569f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 570f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 571f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 572f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 573f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 574f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 575f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 576f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab //TODO: Add support for app consumed format? 577f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 578f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 579f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 5878867984d33ed870071109a4500402dddbc85c048Shuzhen Wang /*For the streams to be reconfigured we need to register the buffers 5881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole since the framework wont*/ 5891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 5901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 5911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->status == RECONFIGURE) { 5921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 5931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*only register buffers for streams that have already been 5941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole registered*/ 5951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->registered) { 5961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = channel->registerBuffers((*it)->buffer_set.num_buffers, 5971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers); 5981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (rc != NO_ERROR) { 5991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Failed to register the buffers of old stream,\ 6001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = %d", __func__, rc); 6011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 602a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: channel %p has %d buffers", 603e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, channel, (*it)->buffer_set.num_buffers); 6040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream); 6081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (index == NAME_NOT_FOUND) { 6091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.add((*it)->stream, 0); 6101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 6111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueAt(index) = 0; 6121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 6130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 6151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Initialize mPendingRequestInfo and mPendnigBuffersMap */ 6161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.clear(); 6171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 61833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang //settings/parameters don't carry over for new configureStreams 6199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 62033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest = true; 62133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 622e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 62333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return rc; 624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 627e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : validateCaptureRequest 628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 629e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service 63080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 63180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 63280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 63380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 63480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 63580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 63680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 637e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest( 6389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 63980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 6409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 6419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 6429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 6439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 6459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 6469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 6479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 6519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 6529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 6539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 6549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 6559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 6589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 6599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 6609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 663c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang b = request->input_buffer; 664c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel *channel = 665c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 666c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (channel == NULL) { 667c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 668c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 669c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 670c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 671c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 672c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 673c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 674c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 675c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 676c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->release_fence != -1) { 677c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 678c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 679c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 680c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 681c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (b->buffer == NULL) { 682c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 683c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, frameNumber, idx); 684c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return BAD_VALUE; 685c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 6869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 6899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 6909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 6919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 6929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 6949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 6959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 6969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 7049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 7059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 7129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 7149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 7159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 7169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 718e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 719e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : registerStreamBuffers 722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @stream_list : streams to be configured 727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = 0; 735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set == NULL) { 739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->stream == NULL) { 744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->num_buffers < 1) { 749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 750e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 751e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 752e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->buffers == NULL) { 754e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 755e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 756e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 757e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 758e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 7620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //set the buffer_set in the mStreamInfo array 7631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 7641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 7651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->stream == stream) { 7660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint32_t numBuffers = buffer_set->num_buffers; 7671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.stream = buffer_set->stream; 7681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.num_buffers = numBuffers; 7691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers]; 7701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->buffer_set.buffers == NULL) { 7710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Failed to allocate buffer_handle_t*", __func__); 7720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_unlock(&mMutex); 7730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole return -ENOMEM; 7740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (size_t j = 0; j < numBuffers; j++){ 7761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers[j] = buffer_set->buffers[j]; 7770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->registered = 1; 7790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 781e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 782e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 783e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 784e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 785e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENODEV; 786e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 787e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 788e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 790e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 791e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 793e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : processCaptureRequest 794e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 795e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service 796e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 797e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 798e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @request : request from framework to process 799e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 800e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 801e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 802e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 803e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_request_t *request) 805e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 806e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = NO_ERROR; 80774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id; 808e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata meta; 809e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 810e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 811e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 812e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = validateCaptureRequest(request); 813e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != NO_ERROR) { 814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: incoming request is not valid", __func__); 815e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 816e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 817e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 818e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 819e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frameNumber = request->frame_number; 820662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = setFrameParameters(request->frame_number, request->settings); 8219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 8229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: fail to set frame parameters", __func__); 823e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 8249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 8259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 82774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab meta = request->settings; 82874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab if (meta.exists(ANDROID_REQUEST_ID)) { 82974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0]; 83074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab mCurrentRequestId = request_id; 831013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Received request with id: %d",__func__, request_id); 83274f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else if (mFirstRequest || mCurrentRequestId == -1){ 83374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab ALOGE("%s: Unable to find request id field, \ 83474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab & no previous id available", __func__); 83574f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab return NAME_NOT_FOUND; 83674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } else { 837013ea05a4d0b11d7e76e0a2a791d38441f2a3336Mansoor Aftab ALOGV("%s: Re-using old request id", __func__); 83874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab request_id = mCurrentRequestId; 83974f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab } 84074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 841c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGV("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d", 842c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang __func__, __LINE__, 843c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->num_output_buffers, 844c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer, 845c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang frameNumber); 846e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // Acquire all request buffers first 847e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 848e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 849e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang sp<Fence> acquireFence = new Fence(output.acquire_fence); 85066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 85166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 85266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Call function to store local copy of jpeg data for encode params. 85366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = getJpegSettings(request->settings); 85466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (rc < 0) { 8550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: failed to get jpeg parameters", __func__); 85666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pthread_mutex_unlock(&mMutex); 85766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 85866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 85966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 86066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 861e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 862e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != OK) { 863e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: fence wait failed %d", __func__, rc); 864e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 865e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 866e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 867e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 868e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 8691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Update pending request list and pending buffers map */ 8701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole PendingRequestInfo pendingRequest; 8711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.frame_number = frameNumber; 8721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.num_buffers = request->num_output_buffers; 87374f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab pendingRequest.request_id = request_id; 87474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab 8751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < request->num_output_buffers; i++) { 8761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole RequestedBufferInfo requestedBuf; 8771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.stream = request->output_buffers[i].stream; 8781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.buffer = NULL; 8791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.buffers.push_back(requestedBuf); 8801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 8811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(requestedBuf.stream)++; 8821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 8831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.push_back(pendingRequest); 8841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 8859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 886e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMetadataChannel->request(NULL, frameNumber); 8879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 8889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 8899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 8909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 8919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 892c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mm_camera_buf_def_t *pInputBuffer = NULL; 89366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 8949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 8959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 8969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 8979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 89966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 900c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3RegularChannel* inputChannel = NULL; 901c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(request->input_buffer != NULL){ 902c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 903c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang //Try to get the internal format 904c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel = (QCamera3RegularChannel*) 905c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->stream->priv; 906c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(inputChannel == NULL ){ 907c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: failed to get input channel handle", __func__); 908c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else { 909c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer = 910c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang inputChannel->getInternalFormatBuffer( 911c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang request->input_buffer->buffer); 912c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("%s: Input buffer dump",__func__); 913c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("Stream id: %d", pInputBuffer->stream_id); 914c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("streamtype:%d", pInputBuffer->stream_type); 915c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("frame len:%d", pInputBuffer->frame_len); 916c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 917c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 918c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang rc = channel->request(output.buffer, frameNumber, mJpegSettings, 919c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang pInputBuffer,(QCamera3Channel*)inputChannel); 92066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 921a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__, 922a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab __LINE__, output.buffer, frameNumber); 92366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = channel->request(output.buffer, frameNumber); 92466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 9259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 9269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 9279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 9289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 9291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mFirstRequest = false; 9301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 9329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 1; 9339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang while (mPendingRequest == 1) { 9345b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_cond_wait(&mRequestCond, &mMutex); 9359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 9369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 937e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 93880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 93980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 94080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 9419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 942e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : getMetadataVendorTagOps 9439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 944e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 9459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 9469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 947e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 948e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 949e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 950e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 951b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps( 952b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang vendor_tag_query_ops_t* /*ops*/) 953e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 954e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Enable locks when we eventually add Vendor Tags */ 955e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 956e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 957e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 958e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 959e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 960e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 961e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 962e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 963e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 964e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : dump 965e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 966e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 967e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 968e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 969e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 970e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 971e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 972e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 973b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/) 974e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /*Enable lock when we implement this function*/ 976e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 977e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 978e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 980e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 981e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 982e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 986e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 98733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result 98833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * (streams, as well as metadata) 989e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 990e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 991e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @metadata : metadata information 99233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. 99333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * NULL if metadata. 9949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 9959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 9969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 9971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf, 998e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 9999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 10005b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_lock(&mMutex); 1001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 10021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (metadata_buf) { 10031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer; 100433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int32_t frame_number_valid = *(int32_t *) 100533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata); 1006152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang uint32_t pending_requests = *(uint32_t *)POINTER_OF( 1007152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang CAM_INTF_META_PENDING_REQUESTS, metadata); 100833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang uint32_t frame_number = *(uint32_t *) 100933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata); 10100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole const struct timeval *tv = (const struct timeval *) 10110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata); 10120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC + 10130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole tv->tv_usec * NSEC_PER_USEC; 10140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 10151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!frame_number_valid) { 1016a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: Not a valid frame number, used as SOF only", __func__); 10171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->bufDone(metadata_buf); 10181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole goto done_metadata; 10191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1020a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__, 1021e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang frame_number, capture_time); 10221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Go through the pending requests info and send shutter/results to frameworks 10241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1025e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i != mPendingRequestsList.end() && i->frame_number <= frame_number;) { 10261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 10271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_notify_msg_t notify_msg; 1028a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number); 10291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Flush out all entries with less or equal frame numbers. 10311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 1032e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: Make sure shutter timestamp really reflects shutter timestamp. 1033e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //Right now it's the same as metadata timestamp 1034e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 1035e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: When there is metadata drop, how do we derive the timestamp of 1036e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //dropped frames? For now, we fake the dropped timestamp by substracting 1037e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //from the reported timestamp 1038e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang nsecs_t current_capture_time = capture_time - 1039e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang (frame_number - i->frame_number) * NSEC_PER_33MSEC; 1040e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 10411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send shutter notify to frameworks 10421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.type = CAMERA3_MSG_SHUTTER; 10431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.message.shutter.frame_number = i->frame_number; 1044e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang notify_msg.message.shutter.timestamp = current_capture_time; 10451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->notify(mCallbackOps, ¬ify_msg); 1046a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__, 1047e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i->frame_number, capture_time); 10481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send empty metadata with already filled buffers for dropped metadata 10501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // and send valid metadata with already filled buffers for current metadata 10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i->frame_number < frame_number) { 105299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang CameraMetadata dummyMetadata; 105399b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP, 1054e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ¤t_capture_time, 1); 105599b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang dummyMetadata.update(ANDROID_REQUEST_ID, 105674f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab &(i->request_id), 1); 105799b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang result.result = dummyMetadata.release(); 10581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 1059e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.result = translateCbMetadataToResultMetadata(metadata, 106074f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab current_capture_time, i->request_id); 10611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Return metadata buffer 10621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->bufDone(metadata_buf); 10631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result.result) { 10651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: metadata is NULL", __func__); 10661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.frame_number = i->frame_number; 10681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 0; 1069e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.output_buffers = NULL; 10701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1071e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 10721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 10731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers++; 10741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (result.num_output_buffers > 0) { 10781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_stream_buffer_t *result_buffers = 10791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole new camera3_stream_buffer_t[result.num_output_buffers]; 10801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result_buffers) { 10811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Fatal error: out of memory", __func__); 10821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole size_t result_buffers_idx = 0; 10841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1085e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 10861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 10871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result_buffers[result_buffers_idx++] = *(j->buffer); 10881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free(j->buffer); 108913dab24b078e0aa9761969429b95f96bbe2cb316Shuzhen Wang j->buffer = NULL; 10901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(j->stream)--; 10911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = result_buffers; 10941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 10951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1096a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: meta frame_number = %d, capture_time = %lld", 1097d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 10981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 10991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete[] result_buffers; 11001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 11011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 1102a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: meta frame_number = %d, capture_time = %lld", 1103d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__, result.frame_number, current_capture_time); 11041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 11051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // erase the element from the list 11071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i = mPendingRequestsList.erase(i); 11081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 110933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 111033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 11111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata: 11121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole bool max_buffers_dequeued = false; 11131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < mPendingBuffersMap.size(); i++) { 11141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i); 1115e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang uint32_t queued_buffers = mPendingBuffersMap.valueAt(i); 11161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (queued_buffers == stream->max_buffers) { 11171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole max_buffers_dequeued = true; 11181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole break; 11191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1121152ee3049941f9d51276932f0b507b800723b1deShuzhen Wang if (!max_buffers_dequeued && !pending_requests) { 11221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Unblock process_capture_request 11231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequest = 0; 11241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_cond_signal(&mRequestCond); 11251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 11271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // If the frame number doesn't exist in the pending request list, 11281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // directly send the buffer to the frameworks, and update pending buffers map 11291c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Otherwise, book-keep the buffer. 11301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 1131c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang while (i != mPendingRequestsList.end() && i->frame_number != frame_number){ 11321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i++; 1133c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 11341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i == mPendingRequestsList.end()) { 11351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Verify all pending requests frame_numbers are greater 11361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin(); 1137e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != mPendingRequestsList.end(); j++) { 11381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->frame_number < frame_number) { 11391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: pending frame number %d is smaller than %d", 11401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole __func__, j->frame_number, frame_number); 11411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 11441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.result = NULL; 114533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang result.frame_number = frame_number; 11461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 1; 11471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = buffer; 1148a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: result frame_number = %d, buffer = %p", 1149e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, frame_number, buffer); 11501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(buffer->stream)--; 1151e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 115233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } else { 11531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1154e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 11551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->stream == buffer->stream) { 11561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer != NULL) { 11571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: buffer is already set", __func__); 11581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 11591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole j->buffer = (camera3_stream_buffer_t *)malloc( 11601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(camera3_stream_buffer_t)); 11611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole *(j->buffer) = *buffer; 1162a7661be16c776d6695b0488479cbd5de1a6a5d8bMansoor Aftab ALOGV("%s: cache buffer %p at result frame_number %d", 1163e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, buffer, frame_number); 11641c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 11661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1167e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 11689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 11699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 11705b777f856726fb16e8cec1f1c22b84dfc6ebd68bShuzhen Wang pthread_mutex_unlock(&mMutex); 11719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 11729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 11739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 117497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 117597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : translateCbMetadataToResultMetadata 117697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 117797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: 117897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 117997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 118097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @metadata : metadata information from callback 118197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 118297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN : camera_metadata_t* 118397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * metadata in a format specified by fwk 118497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 118597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* 118697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata 118774f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab (metadata_buffer_t *metadata, nsecs_t timestamp, 118874f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab int32_t request_id) 118997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 119097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata camMetadata; 119197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camera_metadata_t* resultMetadata; 119297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); 119474f6761b0f475069b59e715fcf8753b1664e0bdbMansoor Aftab camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1); 119597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 119697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_HISTOGRAM - TODO*/ 119797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*cam_hist_stats_t *histogram = 119897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM, 119997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole metadata);*/ 120097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 120197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*face detection*/ 120297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *) 120397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata); 120497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t numFaces = faceDetectionInfo->num_faces_detected; 120597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceIds[numFaces]; 120697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t faceScores[numFaces]; 120797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceRectangles[numFaces * 4]; 120897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceLandmarks[numFaces * 6]; 120997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int j = 0, k = 0; 121097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < numFaces; i++) { 121197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceIds[i] = faceDetectionInfo->faces[i].face_id; 121297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceScores[i] = faceDetectionInfo->faces[i].score; 121359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(faceDetectionInfo->faces[i].face_boundary, 121497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles+j, -1); 121597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k); 121697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole j+= 4; 121797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole k+= 6; 121897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 121999b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang if (numFaces > 0) { 122099b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces); 122199b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces); 122299b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES, 122397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles, numFaces*4); 122499b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS, 122597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceLandmarks, numFaces*6); 122699b3fc5de98314ad3cd91fc68c97070c3fc3e4d4Shuzhen Wang } 122797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12288867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t *color_correct_mode = 12290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata); 123097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1); 123197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 123297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *ae_precapture_id = 123397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata); 123497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1); 123597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 123697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*aec regions*/ 123797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAeRegions = 123897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata); 123997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t aeRegions[5]; 124059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight); 124197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5); 12428bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani if(mIsZslMode) { 12438bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani uint8_t ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED; 12448bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani camMetadata.update(ANDROID_CONTROL_AE_STATE, &ae_state, 1); 12458bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani } else { 12468bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani uint8_t *ae_state = 12478bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata); 12488bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1); 12498bb5784949bef76a5880ca3c9a795c71b6ac680bAjay Dudani } 12500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *focusMode = 12510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata); 125297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1); 125397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 125497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*af regions*/ 125597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAfRegions = 125697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata); 125797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t afRegions[5]; 125859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight); 125997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5); 126097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata); 126297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1); 126397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 126497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *afTriggerId = 126597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata); 126697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1); 126797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalance = 12690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata); 127097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1); 127197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 127297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*awb regions*/ 127397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAwbRegions = 127497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata); 127597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t awbRegions[5]; 127659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight); 127797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5); 127897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalanceState = 12800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata); 128197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1); 128297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata); 128497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_MODE, mode, 1); 128597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata); 128797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1); 128897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashPower = 12900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata); 129197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1); 129297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 129397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *flashFiringTime = 129497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata); 129597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1); 129697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 129797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *ledMode = 129897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata); 129997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/ 130097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashState = 13020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata); 130397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_STATE, flashState, 1); 130497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *hotPixelMode = 13060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata); 130797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1); 130897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 130997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *lensAperture = 131097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata); 131197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1); 131297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 131397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *filterDensity = 131497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata); 131597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1); 131697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 131797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focalLength = 131897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata); 131997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1); 132097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 132197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusDistance = 132297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata); 132397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1); 132497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 132597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusRange = 132697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata); 132797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1); 132897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *opticalStab = 13300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata); 13310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1); 133297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 133397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *focusState = 133497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata); 133597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */ 133697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *noiseRedMode = 13380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata); 133997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1); 134097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 134197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_SCALER_CROP_REGION - check size*/ 134297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_crop_region_t *hScalerCropRegion =(cam_crop_region_t *) 134497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata); 134571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t scalerCropRegion[4]; 13460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[0] = hScalerCropRegion->left; 13470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[1] = hScalerCropRegion->top; 13480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[2] = hScalerCropRegion->width; 134971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropRegion[3] = hScalerCropRegion->height; 135071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4); 135197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 135297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorExpTime = 135397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata); 135497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1); 135597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 135697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorFameDuration = 135797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata); 135897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1); 135997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 136097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *sensorSensitivity = 136197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata); 13623fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mMetadataResponse.iso_speed = *sensorSensitivity; 136397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1); 136497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *shadingMode = 13660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata); 136797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1); 136897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *faceDetectMode = 13700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata); 137197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1); 137297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *histogramMode = 13740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata); 137597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1); 137697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 13770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *sharpnessMapMode = 13780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata); 137997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 138097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole sharpnessMapMode, 1); 138197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 138297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/ 138397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_sharpness_map_t *sharpnessMap = (cam_sharpness_map_t *) 138497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata); 138597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP, 138697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t*)sharpnessMap->sharpness, 138797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT); 138897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 138997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole resultMetadata = camMetadata.release(); 139033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return resultMetadata; 139197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 139297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 139397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 139459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertToRegions 139597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 139697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array 139797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 139897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 139997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @rect : cam_rect_t struct to convert 140097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @region : int32_t destination array 140197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @weight : if we are converting from cam_area_t, weight is valid 140297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * else weight = -1 140397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 140497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 140559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){ 140697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[0] = rect.left; 140797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[1] = rect.top; 140859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[2] = rect.left + rect.width; 140959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang region[3] = rect.top + rect.height; 141097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (weight > -1) { 141197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[4] = weight; 141297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 141397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 141459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 141559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang/*=========================================================================== 141659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * FUNCTION : convertFromRegions 141759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 141859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * DESCRIPTION: helper method to convert from array to cam_rect_t 141959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 142059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * PARAMETERS : 142159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @rect : cam_rect_t struct to convert 142259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @region : int32_t destination array 142359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * @weight : if we are converting from cam_area_t, weight is valid 142459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * else weight = -1 142559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang * 142659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang *==========================================================================*/ 142759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wangvoid QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi, 142859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang const camera_metadata_t *settings, 142959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang uint32_t tag){ 143059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang CameraMetadata frame_settings; 143159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang frame_settings = settings; 143259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_min = frame_settings.find(tag).data.i32[0]; 143359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_min = frame_settings.find(tag).data.i32[1]; 143459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t x_max = frame_settings.find(tag).data.i32[2]; 143559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang int32_t y_max = frame_settings.find(tag).data.i32[3]; 143659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->weight = frame_settings.find(tag).data.i32[4]; 143759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.left = x_min; 143859a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.top = y_min; 143959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.width = x_max - x_min; 144059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang roi->rect.height = y_max - y_min; 144159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang} 144259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 144397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 144471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * FUNCTION : resetIfNeededROI 144571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 144671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * DESCRIPTION: helper method to reset the roi if it is greater than scaler 144771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * crop region 144871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 144971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * PARAMETERS : 145071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @roi : cam_area_t struct to resize 145171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * @scalerCropRegion : cam_crop_region_t region to compare against 145271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 145371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang * 145471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang *==========================================================================*/ 145571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wangbool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi, 145671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang const cam_crop_region_t* scalerCropRegion) 145771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang{ 145871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_x_max = roi->rect.width + roi->rect.left; 145971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t roi_y_max = roi->rect.height + roi->rect.top; 146071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top; 146171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left; 146271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if ((roi_x_max < scalerCropRegion->left) || 146371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi_y_max < scalerCropRegion->top) || 146471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.left > crop_x_max) || 146571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang (roi->rect.top > crop_y_max)){ 146671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return false; 146771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 146871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.left < scalerCropRegion->left) { 146971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.left = scalerCropRegion->left; 147071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 147171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi->rect.top < scalerCropRegion->top) { 147271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.top = scalerCropRegion->top; 147371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 147471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_x_max > crop_x_max) { 147571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_x_max = crop_x_max; 147671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 147771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (roi_y_max > crop_y_max) { 147871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi_y_max = crop_y_max; 147971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 148071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.width = roi_x_max - roi->rect.left; 148171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang roi->rect.height = roi_y_max - roi->rect.top; 148271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang return true; 148371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang} 148471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang 148571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang/*=========================================================================== 148697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : convertLandmarks 148797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 148897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info 148997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 149097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 149197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @face : cam_rect_t struct to convert 149297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @landmarks : int32_t destination array 149397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 149497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 149597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 149697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks) 149797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 149897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[0] = face.left_eye_center.x; 149997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[1] = face.left_eye_center.y; 150097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[2] = face.right_eye_center.y; 150197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[3] = face.right_eye_center.y; 150297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[4] = face.mouth_center.x; 150397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[5] = face.mouth_center.y; 150497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 150597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 1507625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1508625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 1509625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1510625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 1511625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1512625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 1517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 1518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 1520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 1522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 1523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 1524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 1526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 1527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 1528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 1529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 1530625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1532e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 1533e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (capabilityHeap == NULL) { 1534e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: creation of capabilityHeap failed", __func__); 1535e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang goto heap_creation_failed; 1536e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 1538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 1539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 1540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 1541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 1542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 1545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 1546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 1547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 1548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 1549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1550625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1551625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 1552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 1553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 1556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 1557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 1559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 1562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 1563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 1564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 1567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 1569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 1571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 1572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 1573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 1574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 1575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 1576e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete capabilityHeap; 1577e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed: 1578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 1579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 1580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 1581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1585662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : initParameters 1586662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1587662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters 1588662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1589662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1590662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1591662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1592662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 1593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1594662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1595662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters() 1596662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1597662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 1598662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1599662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Allocate Set Param Buffer 1600662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = new QCamera3HeapMemory(); 1601662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 1602662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc != OK) { 1603662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = NO_MEMORY; 1604662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("Failed to allocate SETPARM Heap memory"); 1605662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1606662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1607662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1608662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1609662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Map memory for parameters buffer 1611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 1612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole CAM_MAPPING_BUF_TYPE_PARM_BUF, 1613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->getFd(0), 1614662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(parm_buffer_t)); 1615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc < 0) { 1616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:failed to map SETPARM buffer",__func__); 1617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = FAILED_TRANSACTION; 1618662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->deallocate(); 1619662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1620662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1622662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1623662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1624662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0); 1625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1627662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 162933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION : deinitParameters 163033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 163133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters 163233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 163333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS : 163433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 163533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN : NONE 163633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/ 163733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters() 163833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{ 163933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 164033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF); 164133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 164233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap->deallocate(); 164333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang delete mParamHeap; 164433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap = NULL; 164533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 164633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters = NULL; 164733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang} 164833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 164933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*=========================================================================== 16500a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * FUNCTION : calcMaxJpegSize 16510a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 16520a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId 16530a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 16540a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * PARAMETERS : 16550a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * 16560a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab * RETURN : max_jpeg_size 16570a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab *==========================================================================*/ 16580a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftabint QCamera3HardwareInterface::calcMaxJpegSize() 16590a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab{ 16600a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int32_t max_jpeg_size = 0; 16610a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int temp_width, temp_height; 16620a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) { 16630a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width; 16640a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height; 16650a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab if (temp_width * temp_height > max_jpeg_size ) { 16660a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = temp_width * temp_height; 16670a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 16680a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 16690a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 16700a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab return max_jpeg_size; 16710a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab} 16720a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab 16730a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab/*=========================================================================== 1674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 1675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 1677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 1683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 1684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 1686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 168897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata staticInfo; 1689c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 1690c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang /* android.info: hardware level */ 1691c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_FULL; 1692c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, 1693c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang &supportedHardwareLevel, 1); 1694c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 1695662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK; 1696662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 3 only*/ 16972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 16982dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); */ 16992dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 1700e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang /*hard coded for now but this should come from sensor*/ 1701e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang float min_focus_distance; 1702e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if(facingBack){ 1703e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 10; 1704e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 1705e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang min_focus_distance = 0; 1706e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 1707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 17082dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang &min_focus_distance, 1); 1709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 1711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 1712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1713c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*should be using focal lengths but sensor doesn't provide that info now*/ 1714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 1715c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &gCamCapability[cameraId]->focal_length, 1716c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1); 1717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 1719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 1720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 1721625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1722625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 1723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 1724625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 1725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 1728c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)gCamCapability[cameraId]->optical_stab_modes, 1729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 1730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 173180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 173280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 173380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 173480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 173547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 173680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 173780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 173880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 173980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 1740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 174147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 17420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->geo_correction_map_size.height}; 174380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 174480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 174580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 174680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 174780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 174880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 1749c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float)); 175080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 175180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 175280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 175380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 175480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 175580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 175680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 175780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 175880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 175980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 176080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 176180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 1762c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1); 176380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 176447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 176580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 176680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 176780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 176880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 176922817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t active_array_size[] = {0, 0, 177022817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala gCamCapability[cameraId]->active_array_size.width, 177180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 177280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 177322817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala active_array_size, 4); 177480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 177580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 177680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 1777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 177880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 177980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 178080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 178180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 178280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 178380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 178480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 178580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 178680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1787c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 1788c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/ 1789c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*hardcode 0 for now*/ 1790c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang int32_t max_face_count = 0; 179180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 1792c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &max_face_count, 1); 179380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 179480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 179580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 179680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 179780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 179880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 179980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 180047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 180180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 180280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 180380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 180480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 180580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 180680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 180780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 180880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 180980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 181080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 181180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 181280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 181380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 181422817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888, 181522817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala HAL_PIXEL_FORMAT_BLOB}; 181622817c71579a2516bd3bdf748a5bc5fa73b9f32bEino-Ville Talvala int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t); 1817662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 1818662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats, 18198867984d33ed870071109a4500402dddbc85c048Shuzhen Wang scalar_formats_count); 1820662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 182147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_processed_sizes[CAM_FORMAT_MAX * 2]; 1822662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole makeTable(gCamCapability[cameraId]->supported_sizes_tbl, 1823662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->supported_sizes_tbl_cnt, 1824662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes); 1825662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 1826662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes, 1827c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->supported_sizes_tbl_cnt) * 2); 1828e936796df0426c326d043c2359c149024526f4bcShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, 1829e936796df0426c326d043c2359c149024526f4bcShuzhen Wang &gCamCapability[cameraId]->min_duration[0], 1830e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[cameraId]->supported_sizes_tbl_cnt); 18310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 183247a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_fps_ranges[MAX_SIZES_CNT * 2]; 18330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl, 18340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->fps_ranges_tbl_cnt, 18350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole available_fps_ranges); 1836c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 1837c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) ); 1838c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 183947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang camera_metadata_rational exposureCompensationStep = { 1840c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.numerator, 1841c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang gCamCapability[cameraId]->exp_compensation_step.denominator}; 1842c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1843c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &exposureCompensationStep, 1); 1844c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1845c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang /*TO DO*/ 184647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF}; 1847c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 1848c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableVstabModes, sizeof(availableVstabModes)); 1849c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1850b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang /*HAL 1 and HAL 3 common*/ 18519443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab float maxZoom = 4; 1852c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 1853c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &maxZoom, 1); 1854c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 185547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max3aRegions = 1; 1856c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_CONTROL_MAX_REGIONS, 1857c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang &max3aRegions, 1); 1858c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 185947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t availableFaceDetectModes[] = { 186047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang ANDROID_STATISTICS_FACE_DETECT_MODE_OFF }; 1861c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 1862c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang availableFaceDetectModes, 1863c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang sizeof(availableFaceDetectModes)); 1864c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 186547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width, 1866662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->raw_dim.height}; 1867662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 1868662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole raw_size, 1869662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(raw_size)/sizeof(uint32_t)); 1870662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 187147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 187280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 187380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 187480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 187580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 187680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1877662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint8_t lensFacing = (facingBack) ? 187880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 187980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 1880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 188147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t available_jpeg_sizes[MAX_SIZES_CNT * 2]; 1882662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole makeTable(gCamCapability[cameraId]->picture_sizes_tbl, 1883662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->picture_sizes_tbl_cnt, 1884662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_jpeg_sizes); 1885662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 1886662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_jpeg_sizes, 1887c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2)); 1888c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang 1889c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 189008ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab available_thumbnail_sizes, 189108ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab sizeof(available_thumbnail_sizes)/sizeof(int32_t)); 1892662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 189347a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang int32_t max_jpeg_size = 0; 189497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int temp_width, temp_height; 189597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 189697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width; 189797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height; 189897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (temp_width * temp_height > max_jpeg_size ) { 189997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = temp_width * temp_height; 190097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 190197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 190297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 190397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole staticInfo.update(ANDROID_JPEG_MAX_SIZE, 190497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole &max_jpeg_size, 1); 190597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 190647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_effects[CAM_EFFECT_MODE_MAX]; 19070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t size = 0; 1908662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) { 19090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(EFFECT_MODES_MAP, 1910b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]), 19110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_effects[i]); 19120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 19130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_effects[size] = (uint8_t)val; 19140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 19150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1916662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1917662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 1918662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_effects, 19190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1920662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 192147a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX]; 1922e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t supported_indexes[CAM_SCENE_MODE_MAX]; 19232dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang int32_t supported_scene_modes_cnt = 0; 1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) { 19250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(SCENE_MODES_MAP, 1926b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 19270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_scene_modes[i]); 19280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 1929e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val; 1930e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_indexes[supported_scene_modes_cnt] = i; 19312dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt++; 19320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1933662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1934e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 1935662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 1936662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_scene_modes, 19372dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported_scene_modes_cnt); 1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 193947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3]; 1940e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides, 1941e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt, 1942e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 19439443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supported_indexes, 19449443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab cameraId); 1945e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 1946e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang scene_mode_overrides, 1947e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang supported_scene_modes_cnt*3); 1948e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 194947a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX]; 19500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1951662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) { 19520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(ANTIBANDING_MODES_MAP, 1953b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 1954b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[cameraId]->supported_antibandings[i]); 19550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 19560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_antibanding_modes[size] = (uint8_t)val; 19570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 19580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 19590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 1960662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1961662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 1962662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_antibanding_modes, 19630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1964662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 196547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX]; 19660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1967662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) { 19680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FOCUS_MODES_MAP, 1969b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 19700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_focus_modes[i]); 19710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 19720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_af_modes[size] = (uint8_t)val; 19730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 19740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1975662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 1977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_af_modes, 19780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1979662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 198047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_awb_modes[CAM_WB_MODE_MAX]; 19810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1982662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) { 19830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP, 1984b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 19850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_white_balances[i]); 19860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 19870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_awb_modes[size] = (uint8_t)val; 19880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 19890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1990662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1991662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 1992662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_awb_modes, 19930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1994662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 199547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang uint8_t avail_flash_modes[CAM_FLASH_MODE_MAX]; 19960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1997662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) { 19980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FLASH_MODES_MAP, 1999b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FLASH_MODES_MAP)/sizeof(FLASH_MODES_MAP[0]), 20000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_flash_modes[i]); 20010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 20020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_flash_modes[size] = (uint8_t)val; 20030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 20040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2005662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2006e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t flashAvailable = 0; 2007e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (size > 1) { 2008e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang //flash is supported 2009e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang flashAvailable = 1; 2010e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2011662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_FLASH_MODE, 2012662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_flash_modes, 20130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 2014662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2015e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE, 2016e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang &flashAvailable, 1); 2017e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 2018e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t avail_ae_modes[5]; 2019e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size = 0; 2020e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) { 2021e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i]; 2022e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size++; 2023e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2024e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (flashAvailable) { 2025e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; 2026e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; 2027e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; 2028e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2029662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 2030662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_ae_modes, 2031e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang size); 2032ea44a483c0e98200c058a85ea339457616516847Zhijun He 2033e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t sensitivity_range[2]; 2034e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity; 2035e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity; 2036ea44a483c0e98200c058a85ea339457616516847Zhijun He staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE, 2037ea44a483c0e98200c058a85ea339457616516847Zhijun He sensitivity_range, 2038ea44a483c0e98200c058a85ea339457616516847Zhijun He sizeof(sensitivity_range) / sizeof(int32_t)); 20392dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 204073c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, 204173c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy &gCamCapability[cameraId]->max_analog_sensitivity, 204273c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy sizeof(int32_t) ); 204373c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 2044e936796df0426c326d043c2359c149024526f4bcShuzhen Wang &gCamCapability[cameraId]->jpeg_min_duration[0], 2045e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[cameraId]->picture_sizes_tbl_cnt); 204673c570caacb28bc79e73e6c4dfed4536483a8660Nagesh Subba Reddy 2047b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang gStaticMetadata[cameraId] = staticInfo.release(); 2048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2052662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : makeTable 2053662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2054662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes 2055662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2056662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2057662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2058662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2059662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2060662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size, 2061662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t* sizeTable) 2062662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2063662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int j = 0; 2064662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < size; i++) { 2065662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j] = dimTable[i].width; 2066662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j+1] = dimTable[i].height; 2067662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole j+=2; 2068662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2069662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 20700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 20710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*=========================================================================== 20720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : makeFPSTable 20730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 20740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges 20750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 20760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS : 20770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 20780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/ 20790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size, 2080c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang int32_t* fpsRangesTable) 20810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{ 20820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int j = 0; 20830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < size; i++) { 2084c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps; 2085c31ab1ae7cd6b6eb410e71ead51dd36089dc2397Shuzhen Wang fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps; 20860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole j+=2; 20870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 20880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole} 20892dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 20902dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang/*=========================================================================== 20912dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * FUNCTION : makeOverridesList 20922dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 20932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * DESCRIPTION: make a list of scene mode overrides 20942dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 20952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * PARAMETERS : 20962dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 20972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang * 20982dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang *==========================================================================*/ 20992dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wangvoid QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable, 2100e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t size, uint8_t* overridesList, 21019443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t* supported_indexes, 21029443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int camera_id) 21032dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang{ 21042dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*daemon will give a list of overrides for all scene modes. 21052dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang However we should send the fwk only the overrides for the scene modes 21062dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang supported by the framework*/ 21079443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab int j = 0, index = 0, supt = 0; 21089443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t focus_override; 21092dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang for (int i = 0; i < size; i++) { 21109443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 0; 2111e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang index = supported_indexes[i]; 21129443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j] = (uint8_t)overridesTable[index].ae_mode; 21139443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP, 21149443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 21159443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesTable[index].awb_mode); 21169443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override = (uint8_t)overridesTable[index].af_mode; 21179443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) { 21189443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) { 21199443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab supt = 1; 21209443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab break; 21219443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 21229443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 21239443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (supt) { 21249443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP, 21259443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 21269443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab focus_override); 21279443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } else { 21289443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF; 21299443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 21302dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang j+=3; 21312dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang } 21322dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang} 21332dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2134662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2135662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : getPreviewHalPixelFormat 2136662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2137662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework 2138662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2139662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend 2140662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2141662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN : format recognized by framework 2142662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2143662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2144662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format) 2145662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2146662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t halPixelFormat; 2147662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2148662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole switch (format) { 2149662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV12: 2150662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; 2151662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2152662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21: 2153662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2154662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2155662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21_ADRENO: 2156662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO; 2157662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2158662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_YV12: 2159662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YV12; 2160662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2161662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV16: 2162662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV61: 2163662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole default: 2164662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2165662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2166662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2167662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return halPixelFormat; 2168662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2169662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2170662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 21713fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * FUNCTION : getSensorSensitivity 21723fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 21733fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * DESCRIPTION: convert iso_mode to an integer value 21743fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 21753fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * PARAMETERS : iso_mode : the iso_mode supported by sensor 21763fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 21773fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang ** RETURN : sensitivity supported by sensor 21783fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang * 21793fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang *==========================================================================*/ 21803fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wangint32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode) 21813fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang{ 21823fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang int32_t sensitivity; 21833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 21843fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang switch (iso_mode) { 21853fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_100: 21863fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 100; 21873fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 21883fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_200: 21893fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 200; 21903fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 21913fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_400: 21923fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 400; 21933fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 21943fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_800: 21953fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 800; 21963fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 21973fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang case CAM_ISO_MODE_1600: 21983fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = 1600; 21993fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 22003fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang default: 22013fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang sensitivity = -1; 22023fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang break; 22033fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 22043fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang return sensitivity; 22053fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang} 22063fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 22073fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 22083fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang/*=========================================================================== 2209662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : AddSetParmEntryToBatch 2210662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2211662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch 2212662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2213662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2214662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @p_table : ptr to parameter buffer 2215662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramType : parameter type 2216662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramLength : length of parameter value 2217662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramValue : ptr to parameter value 2218662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2219662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2220662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 2221662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2222662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2223662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table, 2224662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole cam_intf_parm_type_t paramType, 2225662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint32_t paramLength, 2226662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole void *paramValue) 2227662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2228662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int position = paramType; 2229662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int current, next; 2230662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2231662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2232662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Code to take care of linking next flags * 2233662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2234662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_FIRST_PARAM_ID(p_table); 2235662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position == current){ 2236662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //DO NOTHING 2237662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else if (position < current){ 2238662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, current); 2239662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_FIRST_PARAM_ID(p_table, position); 2240662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 2241662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /* Search for the position in the linked list where we need to slot in*/ 2242662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole while (position > GET_NEXT_PARAM_ID(current, p_table)) 2243662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_NEXT_PARAM_ID(current, p_table); 2244662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2245662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*If node already exists no need to alter linking*/ 2246662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position != GET_NEXT_PARAM_ID(current, p_table)) { 2247662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole next = GET_NEXT_PARAM_ID(current, p_table); 2248662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(current, p_table, position); 2249662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, next); 2250662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2251662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2252662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2253662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2254662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Copy contents into entry * 2255662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2256662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2257662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (paramLength > sizeof(parm_type_t)) { 2258662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:Size of input larger than max entry size",__func__); 2259662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2260662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2261662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength); 2262662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NO_ERROR; 2263662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2264662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2265662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2266662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupFwkName 2267662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2268662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2269662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2270662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2271662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2272662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2273662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2274662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @hal_name : name of the hal_parm to map 2275662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2276662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int type of status 2277662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * fwk_name -- success 2278662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2279662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 22800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[], 2281662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int hal_name) 2282662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2283662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2284d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang for (int i = 0; i < len; i++) { 2285d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang if (arr[i].hal_name == hal_name) 2286d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return arr[i].fwk_name; 2287662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2288d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 2289d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang /* Not able to find matching framework type is not necessarily 2290d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * an error case. This happens when mm-camera supports more attributes 2291d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang * than the frameworks do */ 2292d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Cannot find matching framework type", __func__); 2293d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang return NAME_NOT_FOUND; 2294662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2295662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2296662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2297662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupHalName 2298662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2299662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2300662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2301662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2302662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2303662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2304662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2305662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @fwk_name : name of the hal_parm to map 2306662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2307662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2308662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * hal_name -- success 2309662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2310662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 23110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[], 2312662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int fwk_name) 2313662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2314662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 2315662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].fwk_name == fwk_name) 2316662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].hal_name; 2317662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 23180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Cannot find matching hal type", __func__); 2319662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NAME_NOT_FOUND; 2320662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2321662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2322662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 2324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 2326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 2330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 2333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 2334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 2336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 2337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 2339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 2341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 2342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 2344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2348b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang if (NULL == gStaticMetadata[cameraId]) { 2349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 2350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 2356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 2357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 2358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 2361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 2362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 2366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 2367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 2372e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0); 2373b6c8485f9005cf0f759c49e2256e1a4382e5628cShuzhen Wang info->static_camera_characteristics = gStaticMetadata[cameraId]; 2374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 2380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 2382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 2384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 2387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 2388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 239097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type) 2391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2392e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 2393e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 2395e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 2399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 240097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata settings; 2401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 2402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 2403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 2404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 2406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 2408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 2409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 2410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 2411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 2413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 2414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 2416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 2417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 2419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 2420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 2422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 2423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 2426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 2429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 24309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 24319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 2432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 2434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 2435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 2437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 2438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 2440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 2441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 2443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 2444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 2446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 2447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 2449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 2450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2451e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang static uint8_t focusMode; 2452e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) { 2453e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to auto", __func__); 2454e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_AUTO; 2455e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2456e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang ALOGE("%s: Setting focus mode to off", __func__); 2457e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang focusMode = ANDROID_CONTROL_AF_MODE_OFF; 2458e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 24592dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1); 24602dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 24612dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON; 24622dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1); 24632dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang 2464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 2465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 2466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 2467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 247047a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_aperture = gCamCapability[mCameraId]->apertures[0]; 2471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 2472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2473b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang if (gCamCapability[mCameraId]->filter_densities_count) { 247447a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 2475b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 2476b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[mCameraId]->filter_densities_count); 2477b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang } 2478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 24799a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang float default_focal_length = gCamCapability[mCameraId]->focal_length; 24809a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 2481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 2483e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2484e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 248980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 249080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 249180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 249280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 249380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 249480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 249580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 249680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 249780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 249880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 249980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 250080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 2501662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id, 2502662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const camera_metadata_t *settings) 250380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 250480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 250580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 250633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (settings == NULL && mFirstRequest) { 250780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 250880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 2509662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 251033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2511b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 2512b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang 2513b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 251433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 2515b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 2516b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(hal_version), &hal_version); 251733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2518662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*we need to update the frame number in the parameters*/ 2519662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 2520662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(frame_id), &frame_id); 2521662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (rc < 0) { 2522662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s: Failed to set the frame number in the parameters", __func__); 2523662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2524662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 25250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2526662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(settings != NULL){ 25271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = translateMetadataToParameters(settings); 252880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 252980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 2530662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 253180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 253280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 253380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 253480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 253580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 253680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 253780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 253880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 253980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 254080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 254180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 254280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 254380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 254480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 254580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 254680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 254780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 254880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (const camera_metadata_t *settings) 254980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 2550662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 255197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata frame_settings; 2552662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole frame_settings = settings; 2553662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 25540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) { 25560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t antibandingMode = 25570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0]; 25580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING, 25590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(antibandingMode), &antibandingMode); 25600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 256197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 256253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 2563e936796df0426c326d043c2359c149024526f4bcShuzhen Wang int32_t expCompensation = frame_settings.find( 2564e936796df0426c326d043c2359c149024526f4bcShuzhen Wang ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 2565e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (expCompensation < gCamCapability[mCameraId]->exposure_time_range[0]) 2566e936796df0426c326d043c2359c149024526f4bcShuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_time_range[0]; 2567e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (expCompensation > gCamCapability[mCameraId]->exposure_time_range[1]) 2568e936796df0426c326d043c2359c149024526f4bcShuzhen Wang expCompensation = gCamCapability[mCameraId]->exposure_time_range[1]; 256953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION, 257053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab sizeof(expCompensation), &expCompensation); 257153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 257253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab 25730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) { 25740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0]; 25750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK, 25760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeLock), &aeLock); 25770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) { 25790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_fps_range_t fps_range; 25800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.min_fps = 25810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 25820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.max_fps = 25839443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1]; 25840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE, 25850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(fps_range), &fps_range); 25860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 258797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 25882b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang float focalDistance = -1.0; 25892b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) { 25902b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0]; 25912b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 25922b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang CAM_INTF_META_LENS_FOCUS_DISTANCE, 25932b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang sizeof(focalDistance), &focalDistance); 25942b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } 25952b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang 25960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) { 25972dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang uint8_t fwk_focusMode = 25980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0]; 25992b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang uint8_t focusMode; 26002b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) { 26012b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focusMode = CAM_FOCUS_MODE_INFINITY; 26022b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } else{ 26032b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang focusMode = lookupHalName(FOCUS_MODES_MAP, 26042b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang sizeof(FOCUS_MODES_MAP), 26052b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang fwk_focusMode); 26062b70889fa161b79f18eb833d0c3930ad0c851e56Shuzhen Wang } 26070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE, 26080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focusMode), &focusMode); 26090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2610662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 26110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) { 26120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t awbLock = 26130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0]; 26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK, 26150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(awbLock), &awbLock); 26160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) { 26190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_whiteLevel = 26200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0]; 26210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP, 26220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(WHITE_BALANCE_MODES_MAP), 26230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_whiteLevel); 26240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE, 26250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(whiteLevel), &whiteLevel); 26260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) { 26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_effectMode = 26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0]; 26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP, 26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(EFFECT_MODES_MAP), 26330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_effectMode); 26340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT, 26350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(effectMode), &effectMode); 26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 26390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_aeMode = 26400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 2641e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang uint8_t aeMode; 2642e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t redeye; 26436356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani 2644e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) { 2645e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_OFF; 2646e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2647e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aeMode = CAM_AE_MODE_ON; 2648e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2649e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) { 2650e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 1; 2651e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } else { 2652e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang redeye = 0; 2653e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 26546356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani 2655e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP, 2656e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(AE_FLASH_MODE_MAP), 2657f7d51831acde505c8cda8e60ab651b113326c6b7Shuzhen Wang fwk_aeMode); 26580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE, 26590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeMode), &aeMode); 2660e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 2661e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(flashMode), &flashMode); 2662e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION, 2663e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang sizeof(redeye), &redeye); 26640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) { 26670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t colorCorrectMode = 26680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0]; 26690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = 26700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE, 26710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(colorCorrectMode), &colorCorrectMode); 26720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2673e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang cam_trigger_t aecTrigger; 2674e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE; 2675e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang aecTrigger.trigger_id = -1; 26762dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&& 26772dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) { 26782dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger = 26790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0]; 26802dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang aecTrigger.trigger_id = 26812dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0]; 26820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, 26841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(aecTrigger), &aecTrigger); 26850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26862dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang /*af_trigger must come with a trigger id*/ 26872dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) && 26882dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) { 26892dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang cam_trigger_t af_trigger; 26902dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger = 26910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0]; 26922dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang af_trigger.trigger_id = 26932dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0]; 26940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26952dd2f652b9cdd9e1d3db1d4157e38756370d7409Shuzhen Wang CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger); 26960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_MODE)) { 26990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0]; 27000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE, 27010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(metaMode), &metaMode); 27029443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) { 27039443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0]; 27049443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP, 27059443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 27069443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab fwk_sceneMode); 27079443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 2708827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab sizeof(sceneMode), &sceneMode); 2709827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab } else if (metaMode == ANDROID_CONTROL_MODE_OFF) { 2710827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 2711827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 2712827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab sizeof(sceneMode), &sceneMode); 2713827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) { 2714827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF; 2715827c33fdbfdbd07c5af33ecc8a2f3619f5c8fcb3Mansoor Aftab rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE, 27169443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab sizeof(sceneMode), &sceneMode); 27179443c6d3cd31da9b89221a4261debfeddafe3b00Mansoor Aftab } 27180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) { 27210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t demosaic = 27220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0]; 27230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC, 27240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(demosaic), &demosaic); 27250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_MODE)) { 27280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 27290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE, 27300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(edgeMode), &edgeMode); 27310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) { 27340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t edgeStrength = 27350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0]; 27360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 27370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength); 27380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2740e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang if (frame_settings.exists(ANDROID_FLASH_MODE)) { 27416356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani int32_t respectFlashMode = 1; 27426356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 27436356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t fwk_aeMode = 27446356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 27456356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) { 27466356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani respectFlashMode = 0; 27476356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: AE Mode controls flash, ignore android.flash.mode", 27486356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani __func__); 27496356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 27506356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 27516356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani if (respectFlashMode) { 27526356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani uint8_t flashMode = 27536356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani frame_settings.find(ANDROID_FLASH_MODE).data.u8[0]; 27546356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP, 27556356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(FLASH_MODES_MAP), 27566356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani flashMode); 27576356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani ALOGI("%s: flash mode after mapping %d", __func__, flashMode); 27586356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani // To check: CAM_INTF_META_FLASH_MODE usage 27596356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE, 27606356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani sizeof(flashMode), &flashMode); 27616356e2d4fc01ff878ac4664d86892c8d81e330a9Ajay Dudani } 2762e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang } 2763e9a0b4995192d264f75543f62efa089845456291Shuzhen Wang 27640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) { 27650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t flashPower = 27660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0]; 27670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER, 27680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(flashPower), &flashPower); 27690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) { 27720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t flashFiringTime = 27730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0]; 27740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 27750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime); 27760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) { 27790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t geometricMode = 27800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0]; 27810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE, 27820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricMode), &geometricMode); 27830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) { 27868867984d33ed870071109a4500402dddbc85c048Shuzhen Wang uint8_t geometricStrength = 27870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0]; 27880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 27890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_GEOMETRIC_STRENGTH, 27900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricStrength), &geometricStrength); 27910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) { 27940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t hotPixelMode = 27950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0]; 27960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE, 27970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(hotPixelMode), &hotPixelMode); 27980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_APERTURE)) { 28010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float lensAperture = 28020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find( ANDROID_LENS_APERTURE).data.f[0]; 28030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE, 28040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(lensAperture), &lensAperture); 28050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) { 28080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float filterDensity = 28090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0]; 28100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY, 28110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(filterDensity), &filterDensity); 28120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 28150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float focalLength = 28160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 28170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 28180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_FOCAL_LENGTH, 28190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focalLength), &focalLength); 28200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) { 28230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t optStabMode = 28240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0]; 28258867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 28260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_OPT_STAB_MODE, 28270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(optStabMode), &optStabMode); 28280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) { 28310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedMode = 28320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]; 28338867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 28340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_MODE, 28350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedMode), &noiseRedMode); 28360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) { 28390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedStrength = 28400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0]; 28418867984d33ed870071109a4500402dddbc85c048Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, 28420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_STRENGTH, 28430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedStrength), &noiseRedStrength); 28440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 284671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang cam_crop_region_t scalerCropRegion; 284771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool scalerCropSet = false; 28480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) { 28490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.left = 28500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0]; 28510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.top = 28520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1]; 28530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.width = 28540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2]; 285547a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang scalerCropRegion.height = 285647a3010f28bcbf34695ad53608b98be07b4618a6Shuzhen Wang frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3]; 28570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 28580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SCALER_CROP_REGION, 28590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(scalerCropRegion), &scalerCropRegion); 286071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang scalerCropSet = true; 28610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { 28640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorExpTime = 28650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0]; 28660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 28670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_EXPOSURE_TIME, 28680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorExpTime), &sensorExpTime); 28690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) { 28720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorFrameDuration = 28730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0]; 2874e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration) 2875e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration; 28760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 28770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_FRAME_DURATION, 28780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorFrameDuration), &sensorFrameDuration); 28790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 28820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t sensorSensitivity = 28830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 2884e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity < 2885e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity) 2886e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 2887e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.min_sensitivity; 2888e936796df0426c326d043c2359c149024526f4bcShuzhen Wang if (sensorSensitivity > 2889e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity) 2890e936796df0426c326d043c2359c149024526f4bcShuzhen Wang sensorSensitivity = 2891e936796df0426c326d043c2359c149024526f4bcShuzhen Wang gCamCapability[mCameraId]->sensitivity_range.max_sensitivity; 28920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 28930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_SENSITIVITY, 28940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorSensitivity), &sensorSensitivity); 28950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 28960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 28970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_MODE)) { 28980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t shadingMode = 28990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_MODE).data.u8[0]; 29000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE, 29010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingMode), &shadingMode); 29020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) { 29050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t shadingStrength = 29060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0]; 29070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH, 29080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingStrength), &shadingStrength); 29090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) { 29120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t facedetectMode = 29130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0]; 29140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 29150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_FACEDETECT_MODE, 29160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(facedetectMode), &facedetectMode); 29170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) { 29200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t histogramMode = 29210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0]; 29220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 29230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_HISTOGRAM_MODE, 29240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(histogramMode), &histogramMode); 29250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) { 29280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t sharpnessMapMode = 29290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0]; 29300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 29310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, 29320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sharpnessMapMode), &sharpnessMapMode); 29330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_TONEMAP_MODE)) { 29360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t tonemapMode = 29370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0]; 29380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 29390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_TONEMAP_MODE, 29400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(tonemapMode), &tonemapMode); 29410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 29420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 29430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 29440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t captureIntent = 29450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 29460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 29470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(captureIntent), &captureIntent); 29480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2949662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 295059a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) { 295159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 295271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 295359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertFromRegions(&roi, settings, ANDROID_CONTROL_AE_REGIONS); 295471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 295571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 295671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 295771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 295871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI, 295971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 296071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 296159a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 296259a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 296359a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) { 296459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 296571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 296659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertFromRegions(&roi, settings, ANDROID_CONTROL_AF_REGIONS); 296771402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 296871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 296971402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 297071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 297171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI, 297271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 297371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 297459a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 297559a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang 297659a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) { 297759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang cam_area_t roi; 297871402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang bool reset = true; 297959a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang convertFromRegions(&roi, settings, ANDROID_CONTROL_AWB_REGIONS); 298071402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (scalerCropSet) { 298171402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang reset = resetIfNeededROI(&roi, &scalerCropRegion); 298271402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 298371402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang if (reset) { 298471402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS, 298571402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang sizeof(roi), &roi); 298671402bc67b7b2729cad7f970d976be15506cfdc7Shuzhen Wang } 298759a548ac1f29a32e40d5de6c3d911469ccdb3f73Shuzhen Wang } 2988662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 2989662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2990662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2991662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 29920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : getJpegSettings 2993662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 29940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL 2995662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2996662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2997662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2998662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @settings : frame settings information from framework 2999662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3000662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 3001662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : success: NO_ERROR 3002662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * failure: 3003662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 3004662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings 3005662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (const camera_metadata_t *settings) 3006662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 3007662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (mJpegSettings) { 30089a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_timestamp) { 30099a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_timestamp); 30109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 30119a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 30129a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_coordinates) { 30139a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 30149a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang free(mJpegSettings->gps_coordinates[i]); 30159a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 30169a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 30179a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 3018662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole free(mJpegSettings); 3019662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = NULL; 3020662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 3021662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t)); 302297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata jpeg_settings; 3023662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings = settings; 3024662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 30250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) { 30260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 30270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0]; 30280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 30290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 0; 30300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) { 30320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_quality = 30330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0]; 30340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 30351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mJpegSettings->jpeg_quality = 85; 30360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) { 30380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.width = 30390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0]; 30400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.height = 30410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1]; 30420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 304308ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.width = 0; 304408ad023e7517b0bb44b3e636abfea3ef3bba0affMansoor Aftab mJpegSettings->thumbnail_size.height = 0; 30450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) { 30470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < 3; i++) { 30489a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*)); 30499a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_coordinates[i]) = 30500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i]; 30510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30523fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else{ 30539a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < 3; i++) { 30549a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_coordinates[i] = NULL; 30553fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } 30560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30579a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 30580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { 30599a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*)); 30609a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang *(mJpegSettings->gps_timestamp) = 30610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0]; 30629a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 30639a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_timestamp = NULL; 30640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 30660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { 30679a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count; 30689a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang for (int i = 0; i < len; i++) { 30699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[i] = 30709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i]; 30719a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 30729a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_processing_method[len-1] != '\0') { 30739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[len] = '\0'; 30749a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 30759a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 30769a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSettings->gps_processing_method[0] = '\0'; 30770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30783fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 30790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 30800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->sensor_sensitivity = 30810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 30823fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang } else { 30833fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed; 30840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 30859a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 30860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 30870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->lens_focal_length = 30880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 30890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 309053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) { 309153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_compensation = 309253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0]; 309353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 309453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step; 30950a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab mJpegSettings->max_jpeg_size = calcMaxJpegSize(); 309680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 309780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 309880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 309980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 3100e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 3101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 3103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 3106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 3107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 3108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 3110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 31111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata, 3112e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, 3113e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frame_number, void *userdata) 3114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 3116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 3117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 3118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3121e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->captureResultCb(metadata, buffer, frame_number); 3122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 3123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 3127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 3129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 3134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 3135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 3138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 3139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3140d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 31481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->initialize(callback_ops); 3149d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 31501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 3155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 3162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 3163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 3164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 3167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 3169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3170d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 31771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->configureStreams(stream_list); 3178d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 31791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 3184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 3186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 3192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 3193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 3194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3195d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 3201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 32021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->registerStreamBuffers(buffer_set); 3203d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 32041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 3209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 3211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 3216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 3217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 32189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 32199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 32209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 3221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3223d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 3225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 3226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 3228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 3230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 323297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole fwk_metadata = hw->translateCapabilityToMetadata(type); 3233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3234d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 3236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 3240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 32489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 32499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 32509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 3251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3252d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 325380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 325480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 325580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 325680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 32579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 325880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 32599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 32601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->processCaptureRequest(request); 3261d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 32621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 3263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 3267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3276e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops( 3277e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, 3278e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang vendor_tag_query_ops_t* ops) 3279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3280d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3281e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3282e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3283e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3284e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3285e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3286e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3287e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3288e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->getMetadataVendorTagOps(ops); 3289d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3290e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 3294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 3295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 3297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 3299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 3301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 3302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 3303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3304e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump( 3305e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, int fd) 3306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3307d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3308e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3309e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 3310e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3311e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 3312e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3313e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3314e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3315e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->dump(fd); 3316d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3317e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 3318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 3319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3320e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 3321e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : close_camera_device 3322e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3323e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 3324e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3325e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 3326e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3327e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 3328e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 3329e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 3330e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 3331e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 3332d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 3333e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int ret = NO_ERROR; 3334e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3335e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>( 3336e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<camera3_device_t *>(device)->priv); 3337e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3338e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("NULL camera device"); 3339e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return BAD_VALUE; 3340e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3341e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete hw; 3342cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang 3343cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_lock(&mCameraSessionLock); 3344cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang mCameraSessionActive = 0; 3345cd500de28de7d527e4d6b1fbbfbe25bdc58829edShuzhen Wang pthread_mutex_unlock(&mCameraSessionLock); 3346d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 3347e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return ret; 3348e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 3349e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 3351