QCamera3HWI.cpp revision b66f295ef24aea24873bcf80cee589835338e2a1
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; 51625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangconst camera_metadata_t *gStaticMetadata; 52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 53662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = { 54662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_OFF, CAM_EFFECT_MODE_OFF }, 55662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_MONO, CAM_EFFECT_MODE_MONO }, 56662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE, CAM_EFFECT_MODE_NEGATIVE }, 57662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE, CAM_EFFECT_MODE_SOLARIZE }, 58662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_SEPIA, CAM_EFFECT_MODE_SEPIA }, 59662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE, CAM_EFFECT_MODE_POSTERIZE }, 60662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD }, 61662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD }, 62662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_EFFECT_MODE_AQUA, CAM_EFFECT_MODE_AQUA } 63662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 64662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 65662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = { 660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_OFF, CAM_WB_MODE_OFF }, 67662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_AUTO, CAM_WB_MODE_AUTO }, 68662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_INCANDESCENT, CAM_WB_MODE_INCANDESCENT }, 69662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_FLUORESCENT, CAM_WB_MODE_FLUORESCENT }, 70662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT}, 71662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_DAYLIGHT, CAM_WB_MODE_DAYLIGHT }, 72662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT }, 73662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_TWILIGHT, CAM_WB_MODE_TWILIGHT }, 74662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AWB_MODE_SHADE, CAM_WB_MODE_SHADE } 75662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 76662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 77662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = { 78662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED, CAM_SCENE_MODE_OFF }, 79662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_ACTION, CAM_SCENE_MODE_ACTION }, 80662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PORTRAIT, CAM_SCENE_MODE_PORTRAIT }, 81662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE, CAM_SCENE_MODE_LANDSCAPE }, 82662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT, CAM_SCENE_MODE_NIGHT }, 83662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT }, 84662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_THEATRE, CAM_SCENE_MODE_THEATRE }, 85662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BEACH, CAM_SCENE_MODE_BEACH }, 86662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SNOW, CAM_SCENE_MODE_SNOW }, 87662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SUNSET, CAM_SCENE_MODE_SUNSET }, 88662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO, CAM_SCENE_MODE_ANTISHAKE }, 89662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_FIREWORKS , CAM_SCENE_MODE_FIREWORKS }, 90662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_SPORTS , CAM_SCENE_MODE_SPORTS }, 91662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_PARTY, CAM_SCENE_MODE_PARTY }, 92662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT, CAM_SCENE_MODE_CANDLELIGHT }, 9397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole { ANDROID_CONTROL_SCENE_MODE_BARCODE, CAM_SCENE_MODE_BARCODE} 94662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 95662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 96662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = { 97b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang { ANDROID_CONTROL_AF_MODE_OFF, CAM_FOCUS_MODE_OFF }, 98b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang { ANDROID_CONTROL_AF_MODE_OFF, CAM_FOCUS_MODE_FIXED }, 99662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_AUTO, CAM_FOCUS_MODE_AUTO }, 100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_MACRO, CAM_FOCUS_MODE_MACRO }, 101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_EDOF, CAM_FOCUS_MODE_EDOF }, 102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE }, 103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO, CAM_FOCUS_MODE_CONTINOUS_VIDEO } 104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = { 107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF, CAM_ANTIBANDING_MODE_OFF }, 108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ }, 109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ }, 110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO } 111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AUTO_EXPOSURE_MAP[] = { 11497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole { ANDROID_CONTROL_AE_MODE_OFF, CAM_AEC_MODE_OFF }, 115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_CONTROL_AE_MODE_ON, CAM_AEC_MODE_FRAME_AVERAGE }, 116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleconst QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = { 119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_OFF, CAM_FLASH_MODE_OFF }, 120662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_ON }, 121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { ANDROID_FLASH_MODE_TORCH, CAM_FLASH_MODE_TORCH} 122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole}; 123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = { 126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang initialize: QCamera3HardwareInterface::initialize, 127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang configure_streams: QCamera3HardwareInterface::configure_streams, 128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang register_stream_buffers: QCamera3HardwareInterface::register_stream_buffers, 129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings, 130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang process_capture_request: QCamera3HardwareInterface::process_capture_request, 131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang get_metadata_vendor_tag_ops: QCamera3HardwareInterface::get_metadata_vendor_tag_ops, 132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang dump: QCamera3HardwareInterface::dump, 133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; 134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3HardwareInterface 138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface 140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera ID 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId) 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang : mCameraId(cameraId), 148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle(NULL), 149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened(false), 15097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mCallbackOps(NULL), 15133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mInputStream(NULL), 15233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mMetadataChannel(NULL), 15333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest(false), 15433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap(NULL), 15533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters(NULL), 15697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mJpegSettings(NULL) 157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 159e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0; 160e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.close = close_camera_device; 161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.ops = &mCameraOps; 162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.priv = this; 163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->version = CAM_HAL_V3; 1649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 1659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_init(&mRequestLock, NULL); 1669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_init(&mRequestCond, NULL); 1679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 168e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 169e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_init(&mMutex, NULL); 17033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang pthread_mutex_init(&mCaptureResultLock, NULL); 17133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 17233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 17333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mDefaultMetadata[i] = NULL; 174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 17966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: destructor of QCamera3HardwareInterface 180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: %d", __func__, __LINE__); 1881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Clean up all channels */ 1891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->stop(); 1901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete mMetadataChannel; 1911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel = NULL; 1921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 1931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 1941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 1951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole channel->stop(); 1961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 1971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free (*it); 1981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 2001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: %d", __func__, __LINE__); 20197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (mJpegSettings != NULL) { 20297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole free(mJpegSettings); 20397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole mJpegSettings = NULL; 20497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 2051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: %d", __func__, __LINE__); 20633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang deinitParameters(); 2071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: %d", __func__, __LINE__); 208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang closeCamera(); 209e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: %d", __func__, __LINE__); 21133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++) 21233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (mDefaultMetadata[i]) 21333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang free_camera_metadata(mDefaultMetadata[i]); 21433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 215e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mRequestLock); 216e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_cond_destroy(&mRequestCond); 217e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 218e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mMutex); 21933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang pthread_mutex_destroy(&mCaptureResultLock); 220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //int rc = NO_ERROR; 237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc == 0) 245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang else 247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 3159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 317e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 318e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 31933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang rc = initParameters(); 32033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (rc < 0) { 32133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang ALOGE("%s: initParamters failed %d", __func__, rc); 32233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang goto err1; 32333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } 3249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Create metadata channel and initialize it 325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 326e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraHandle->ops, captureResultCb, 327e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this); 328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mMetadataChannel == NULL) { 329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to allocate metadata channel", __func__); 3309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = -ENOMEM; 33133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang goto err2; 3329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 3339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = mMetadataChannel->initialize(); 3349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 3359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: metadata channel initialization failed", __func__); 3369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err3; 3379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 3389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 3399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCallbackOps = callback_ops; 340e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 341e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 3429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 3439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 3449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr3: 3459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mMetadataChannel; 3469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMetadataChannel = NULL; 34733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangerr2: 34833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang deinitParameters(); 3499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1: 350e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 3519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 36933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int rc = 0; 3700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_lock(&mMutex); 371e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 375e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 381e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 388e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *inputStream = NULL; 3930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /* first invalidate all the steams in the mStreamList 3940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * if they appear again, they will be validated */ 3951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 3961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 3970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = INVALID; 3980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 4011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGV("%s: newStream type = %d, stream format = %d", 4021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole __func__, newStream->stream_type, newStream->format); 4030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //if the stream is in the mStreamList validate it 4040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole bool stream_exists = false; 4051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 4070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if ((*it)->stream == newStream) { 4081c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = 4091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (QCamera3Channel*)(*it)->stream->priv; 4100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_exists = true; 4110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (*it)->status = RECONFIGURE; 4121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*delete the channel object associated with the stream because 4131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole we need to reconfigure*/ 4141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole channel->stop(); 4151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 4161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->stream->priv = NULL; 4170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (!stream_exists) { 4200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //new stream 4210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info_t* stream_info; 4220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info = (stream_info_t* )malloc(sizeof(stream_info_t)); 4230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->stream = newStream; 4240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole stream_info->status = VALID; 4251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole stream_info->registered = 0; 4260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mStreamInfo.push_back(stream_info); 4270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT) { 429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 431e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* TODO: Clean up no longer used streams, and maintain others if this 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * is not the 1st time configureStreams is called */ 4410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole /*clean up invalid streams*/ 4421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t*>::iterator it=mStreamInfo.begin(); 4431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end();) { 4440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if(((*it)->status) == INVALID){ 4451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv; 4461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole channel->stop(); 4471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete channel; 4480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole delete[] (buffer_handle_t*)(*it)->buffer_set.buffers; 4490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole free(*it); 4501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it = mStreamInfo.erase(it); 4511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 4521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it++; 4530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 4540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 45633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang //mMetadataChannel->stop(); 457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 465f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_INPUT: 466f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 467f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 468f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_BIDIRECTIONAL: 469f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 470f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab GRALLOC_USAGE_HW_CAMERA_WRITE; 471f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 472f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case CAMERA3_STREAM_OUTPUT: 473f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 474f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 475f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 476f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 477f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 479625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 4811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 484f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 485f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 486f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 487f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 488f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 489f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 490f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 491f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 492f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 493f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 494f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 495f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 496f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 497f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab case HAL_PIXEL_FORMAT_BLOB: 498f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 499f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab channel = new QCamera3PicChannel(mCameraHandle->camera_handle, 500f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mCameraHandle->ops, captureResultCb, 501f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab &gCamCapability[mCameraId]->padding_info, this, newStream); 502f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 503f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: allocation of channel failed", __func__); 504f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab pthread_mutex_unlock(&mMutex); 505f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return -ENOMEM; 506f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 507f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab //Register Jpeg callback with mm-camera-interface 508f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab rc = channel->initialize(); 509f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (rc < 0) { 510f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: snapshot channel initialization failed", __func__); 511f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab delete channel; 512f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab channel = NULL; 513f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab goto end; 514f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 515f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 516f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab newStream->priv = channel; 517f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 518f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 519f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab //TODO: Add support for app consumed format? 520f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab default: 521f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 522f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab break; 523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 5301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*For the streams to be reconfigured we need to register the buffers 5311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole since the framework wont*/ 5321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 5331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 5341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->status == RECONFIGURE) { 5351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv; 5361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /*only register buffers for streams that have already been 5371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole registered*/ 5381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->registered) { 5391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = channel->registerBuffers((*it)->buffer_set.num_buffers, 5401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers); 5411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (rc != NO_ERROR) { 5421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Failed to register the buffers of old stream,\ 5431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = %d", __func__, rc); 5441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 545e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ALOGE("%s: channel %p has %d buffers", 546e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, channel, (*it)->buffer_set.num_buffers); 5470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 5501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream); 5511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (index == NAME_NOT_FOUND) { 5521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.add((*it)->stream, 0); 5531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 5541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueAt(index) = 0; 5551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 5560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 5571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 5581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Initialize mPendingRequestInfo and mPendnigBuffersMap */ 5591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.clear(); 5601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 56133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang //settings/parameters don't carry over for new configureStreams 5629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 56333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mFirstRequest = true; 56433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 56566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruend: 566e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 56733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return rc; 568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 571e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : validateCaptureRequest 572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 573e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service 57480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 57580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 57680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 57780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 57880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 57980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 58080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 581e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest( 5829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 58380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 5849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 5859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 5869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 5879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 5899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 5909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 5919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 5959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 5969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 5979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 5989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 5999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 6029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 6039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 6049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 6079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //TODO 6089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Not supporting input buffer yet", __func__); 6099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 6139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 6149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 6159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 6169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 6179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 6189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 6199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 6209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 6239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 6249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 6259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 6289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 6299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 6309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 6339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 6349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 6359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 6369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 6389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 6399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 6409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 641e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 642e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 643e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 644e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 645e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : registerStreamBuffers 646e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 647e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 648e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 649e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 650e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @stream_list : streams to be configured 651e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 652e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 653e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 654e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 655e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 656e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 657e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 658e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = 0; 659e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 660e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 661e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 662e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set == NULL) { 663e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 664e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 665e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->stream == NULL) { 668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 669e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 670e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 671e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->num_buffers < 1) { 673e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 674e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 675e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 676e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 677e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->buffers == NULL) { 678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 679e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 680e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 681e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 682e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 683e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 684e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 685e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 6860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole //set the buffer_set in the mStreamInfo array 6871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<stream_info_t *>::iterator it = mStreamInfo.begin(); 6881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole it != mStreamInfo.end(); it++) { 6891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->stream == stream) { 6900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint32_t numBuffers = buffer_set->num_buffers; 6911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.stream = buffer_set->stream; 6921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.num_buffers = numBuffers; 6931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers]; 6941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if ((*it)->buffer_set.buffers == NULL) { 6950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Failed to allocate buffer_handle_t*", __func__); 6960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole pthread_mutex_unlock(&mMutex); 6970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole return -ENOMEM; 6980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 6990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (size_t j = 0; j < numBuffers; j++){ 7001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->buffer_set.buffers[j] = buffer_set->buffers[j]; 7010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7021c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole (*it)->registered = 1; 7030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 7050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 706e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (stream->stream_type != CAMERA3_STREAM_OUTPUT) { 707e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: not yet support non output type stream", __func__); 708e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 709e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 710e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 711e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 712e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 713e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 714e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 715e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENODEV; 716e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 718e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 719e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : processCaptureRequest 724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service 726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 727e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 728e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @request : request from framework to process 729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 730e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_request_t *request) 735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = NO_ERROR; 737e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata meta; 738e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 739e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 740e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 741e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = validateCaptureRequest(request); 742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != NO_ERROR) { 743e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: incoming request is not valid", __func__); 744e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 745e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 746e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 747e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 748e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frameNumber = request->frame_number; 749e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 750662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = setFrameParameters(request->frame_number, request->settings); 7519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 7529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: fail to set frame parameters", __func__); 753e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 7549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 7559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 757e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ALOGV("%s: %d, num_output_buffers = %d", __func__, __LINE__, 758e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang request->num_output_buffers); 759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // Acquire all request buffers first 760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 762e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang sp<Fence> acquireFence = new Fence(output.acquire_fence); 76366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 76466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 76566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Call function to store local copy of jpeg data for encode params. 76666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = getJpegSettings(request->settings); 76766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (rc < 0) { 7680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: failed to get jpeg parameters", __func__); 76966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pthread_mutex_unlock(&mMutex); 77066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 77166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 77266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 77366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 774e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 775e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != OK) { 776e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: fence wait failed %d", __func__, rc); 777e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 778e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 779e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 780e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 781e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 7821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGV("%s: %d", __func__, __LINE__); 7831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 7841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole /* Update pending request list and pending buffers map */ 7851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_mutex_lock(&mRequestLock); 7861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole PendingRequestInfo pendingRequest; 7871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.frame_number = frameNumber; 7881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.num_buffers = request->num_output_buffers; 7891c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole// pendingRequest.metadata = NULL; 7901c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < request->num_output_buffers; i++) { 7911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole RequestedBufferInfo requestedBuf; 7921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.stream = request->output_buffers[i].stream; 7931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole requestedBuf.buffer = NULL; 7941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pendingRequest.buffers.push_back(requestedBuf); 7951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 7961c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(requestedBuf.stream)++; 7971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 7981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequestsList.push_back(pendingRequest); 7991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_mutex_unlock(&mRequestLock); 8001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 8019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 802e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMetadataChannel->request(NULL, frameNumber); 8039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 8049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 8059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 8069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 8079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 80866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 8099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 8109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 8119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 8129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 81466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) { 81566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = channel->request(output.buffer, frameNumber, mJpegSettings); 81666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 8171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: %d, request with buffer %p, frame_number %d", __func__, __LINE__, output.buffer, frameNumber); 81866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = channel->request(output.buffer, frameNumber); 81966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 8209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 8219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 8229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 8241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mFirstRequest = false; 8251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 8269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 8279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_lock(&mRequestLock); 8289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 1; 8299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang while (mPendingRequest == 1) { 8309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_wait(&mRequestCond, &mRequestLock); 8319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_unlock(&mRequestLock); 8339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 834e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 83580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 83680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 83780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 8389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 839e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : getMetadataVendorTagOps 8409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 841e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 8429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 8439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 844e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 845e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 846e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 847e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 848b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps( 849b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang vendor_tag_query_ops_t* /*ops*/) 850e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 851e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Enable locks when we eventually add Vendor Tags */ 852e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 853e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 854e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 855e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 856e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 857e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 858e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 859e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 860e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 861e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : dump 862e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 863e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 864e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 865e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 866e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 867e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 868e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 869e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 870b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangvoid QCamera3HardwareInterface::dump(int /*fd*/) 871e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 872e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /*Enable lock when we implement this function*/ 873e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 874e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 875e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 876e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 877e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 878e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 879e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 880e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 881e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 882e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 883e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 88433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: Callback handler for all capture result 88533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * (streams, as well as metadata) 886e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 887e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 888e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @metadata : metadata information 88933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. 89033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * NULL if metadata. 8919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 8929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 8939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 8941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf, 895e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 8969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 8971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_mutex_lock(&mRequestLock); 898e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 8991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (metadata_buf) { 9001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer; 90133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang int32_t frame_number_valid = *(int32_t *) 90233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata); 90333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang uint32_t frame_number = *(uint32_t *) 90433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata); 9050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole const struct timeval *tv = (const struct timeval *) 9060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata); 9070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC + 9080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole tv->tv_usec * NSEC_PER_USEC; 9090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 9101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!frame_number_valid) { 9111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGI("%s: Not a valid frame number, used as SOF only", __func__); 9121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->bufDone(metadata_buf); 9131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole goto done_metadata; 9141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: valid frame_number = %d, capture_time = %lld", __func__, 916e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang frame_number, capture_time); 9171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Go through the pending requests info and send shutter/results to frameworks 9191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 920e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i != mPendingRequestsList.end() && i->frame_number <= frame_number;) { 9211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 9221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_notify_msg_t notify_msg; 9231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: frame_number in the list is %d", __func__, i->frame_number); 9241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Flush out all entries with less or equal frame numbers. 9261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 927e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: Make sure shutter timestamp really reflects shutter timestamp. 928e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //Right now it's the same as metadata timestamp 929e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 930e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //TODO: When there is metadata drop, how do we derive the timestamp of 931e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //dropped frames? For now, we fake the dropped timestamp by substracting 932e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang //from the reported timestamp 933e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang nsecs_t current_capture_time = capture_time - 934e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang (frame_number - i->frame_number) * NSEC_PER_33MSEC; 935e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang 9361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send shutter notify to frameworks 9371c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.type = CAMERA3_MSG_SHUTTER; 9381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole notify_msg.message.shutter.frame_number = i->frame_number; 939e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang notify_msg.message.shutter.timestamp = current_capture_time; 9401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->notify(mCallbackOps, ¬ify_msg); 9411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: notify frame_number = %d, capture_time = %lld", __func__, 942e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang i->frame_number, capture_time); 9431c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9441c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Send empty metadata with already filled buffers for dropped metadata 9451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // and send valid metadata with already filled buffers for current metadata 9461c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i->frame_number < frame_number) { 947e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang CameraMetadata emptyMetadata(1, 0); 948e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang emptyMetadata.update(ANDROID_SENSOR_TIMESTAMP, 949e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ¤t_capture_time, 1); 950e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.result = emptyMetadata.release(); 9511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 952e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.result = translateCbMetadataToResultMetadata(metadata, 953e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang current_capture_time); 9541c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Return metadata buffer 9551c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mMetadataChannel->bufDone(metadata_buf); 9561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result.result) { 9581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: metadata is NULL", __func__); 9591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.frame_number = i->frame_number; 9611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 0; 962e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.output_buffers = NULL; 9631c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 964e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 9651c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 9661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers++; 9671c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9681c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9691c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9701c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (result.num_output_buffers > 0) { 9711c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_stream_buffer_t *result_buffers = 9721c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole new camera3_stream_buffer_t[result.num_output_buffers]; 9731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!result_buffers) { 9741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Fatal error: out of memory", __func__); 9751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9761c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole size_t result_buffers_idx = 0; 9771c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 978e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 9791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer) { 9801c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result_buffers[result_buffers_idx++] = *(j->buffer); 9811c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free(j->buffer); 9821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(j->stream)--; 9831c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9841c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9851c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = result_buffers; 9861c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole 9871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 9881c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: meta frame_number = %d, capture_time = %lld", __func__, 989e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.frame_number, 990e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang current_capture_time); 9911c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 9921c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole delete[] result_buffers; 9931c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 9941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mCallbackOps->process_capture_result(mCallbackOps, &result); 9951c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: meta frame_number = %d, capture_time = %lld", __func__, 996e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang result.frame_number, current_capture_time); 9971c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole free_camera_metadata((camera_metadata_t *)result.result); 9981c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 9991c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // erase the element from the list 10001c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i = mPendingRequestsList.erase(i); 10011c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 100233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 100333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 10041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godboledone_metadata: 10051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole bool max_buffers_dequeued = false; 10061c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (size_t i = 0; i < mPendingBuffersMap.size(); i++) { 10071c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i); 1008e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang uint32_t queued_buffers = mPendingBuffersMap.valueAt(i); 10091c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (queued_buffers == stream->max_buffers) { 10101c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole max_buffers_dequeued = true; 10111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole break; 10121c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10141c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (!max_buffers_dequeued) { 10151c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Unblock process_capture_request 10161c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingRequest = 0; 10171c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_cond_signal(&mRequestCond); 10181c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 10201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // If the frame number doesn't exist in the pending request list, 10211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // directly send the buffer to the frameworks, and update pending buffers map 10221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Otherwise, book-keep the buffer. 10231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin(); 10241c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole while (i != mPendingRequestsList.end() && i->frame_number != frame_number) 10251c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole i++; 10261c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (i == mPendingRequestsList.end()) { 10271c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole // Verify all pending requests frame_numbers are greater 10281c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin(); 1029e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != mPendingRequestsList.end(); j++) { 10301c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->frame_number < frame_number) { 10311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: pending frame number %d is smaller than %d", 10321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole __func__, j->frame_number, frame_number); 10331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10341c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10351c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole camera3_capture_result_t result; 10361c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.result = NULL; 103733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang result.frame_number = frame_number; 10381c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.num_output_buffers = 1; 10391c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole result.output_buffers = buffer; 10401c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: result frame_number = %d, buffer = %p", 1041e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, frame_number, buffer); 10421c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mPendingBuffersMap.editValueFor(buffer->stream)--; 1043e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 104433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } else { 10451c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole for (List<RequestedBufferInfo>::iterator j = i->buffers.begin(); 1046e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang j != i->buffers.end(); j++) { 10471c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->stream == buffer->stream) { 10481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole if (j->buffer != NULL) { 10491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: Error: buffer is already set", __func__); 10501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } else { 10511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole j->buffer = (camera3_stream_buffer_t *)malloc( 10521c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(camera3_stream_buffer_t)); 10531c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole *(j->buffer) = *buffer; 1054e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang ALOGE("%s: cache buffer %p at result frame_number %d", 1055e502ddd6da40b9779e0d51e5f312f3d378ebe505Shuzhen Wang __func__, buffer, frame_number); 10561c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10571c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 10581c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole } 1059e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 10609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 10619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 10621c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole pthread_mutex_unlock(&mRequestLock); 10639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 10649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 10659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 106697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 106797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : translateCbMetadataToResultMetadata 106897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 106997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: 107097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 107197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 107297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @metadata : metadata information from callback 107397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 107497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * RETURN : camera_metadata_t* 107597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * metadata in a format specified by fwk 107697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 107797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* 107897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya GodboleQCamera3HardwareInterface::translateCbMetadataToResultMetadata 10790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (metadata_buffer_t *metadata, nsecs_t timestamp) 108097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 108197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata camMetadata; 108297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camera_metadata_t* resultMetadata; 108397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 108433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 10850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_SENSOR_TIMESTAMP, ×tamp, 1); 108697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 108797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_HISTOGRAM - TODO*/ 108897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*cam_hist_stats_t *histogram = 108997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM, 109097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole metadata);*/ 109197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 109297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*face detection*/ 109397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *) 109497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata); 109597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t numFaces = faceDetectionInfo->num_faces_detected; 109697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceIds[numFaces]; 109797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole uint8_t faceScores[numFaces]; 109897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceRectangles[numFaces * 4]; 109997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t faceLandmarks[numFaces * 6]; 110097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int j = 0, k = 0; 110197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < numFaces; i++) { 110297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceIds[i] = faceDetectionInfo->faces[i].face_id; 110397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceScores[i] = faceDetectionInfo->faces[i].score; 110497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole convertRegions(faceDetectionInfo->faces[i].face_boundary, 110597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles+j, -1); 110697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k); 110797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole j+= 4; 110897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole k+= 6; 110997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 111097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces); 111197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces); 111297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES, 111397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceRectangles, numFaces*4); 111497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS, 111597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole faceLandmarks, numFaces*6); 111697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 111797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 111897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*autofocus - TODO*/ 111997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*cam_auto_focus_data_t *afData =(cam_auto_focus_data_t *) 112097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_AUTOFOCUS_DATA,metadata);*/ 112197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *color_correct_mode = 11230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata); 112497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1); 112597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 112697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *ae_precapture_id = 112797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata); 112897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1); 112997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 113097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*aec regions*/ 113197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAeRegions = 113297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata); 113397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t aeRegions[5]; 113497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole convertRegions(hAeRegions->rect, aeRegions, hAeRegions->weight); 113597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5); 113697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *ae_state = 11380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata); 113997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1); 114097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *focusMode = 11420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata); 114397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1); 114497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 114597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*af regions*/ 114697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAfRegions = 114797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata); 114897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t afRegions[5]; 114997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole convertRegions(hAfRegions->rect, afRegions, hAfRegions->weight); 115097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5); 115197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata); 115397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1); 115497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 115597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *afTriggerId = 115697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata); 115797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1); 115897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalance = 11600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata); 116197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1); 116297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 116397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*awb regions*/ 116497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_area_t *hAwbRegions = 116597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata); 116697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t awbRegions[5]; 116797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole convertRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight); 116897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5); 116997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *whiteBalanceState = 11710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata); 117297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1); 117397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata); 117597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_CONTROL_MODE, mode, 1); 117697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata); 117897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1); 117997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashPower = 11810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata); 118297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1); 118397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 118497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *flashFiringTime = 118597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata); 118697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1); 118797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 118897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *ledMode = 118997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata); 119097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/ 119197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *flashState = 11930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata); 119497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_FLASH_STATE, flashState, 1); 119597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 11960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *hotPixelMode = 11970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata); 119897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1); 119997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 120097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *lensAperture = 120197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata); 120297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1); 120397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 120497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *filterDensity = 120597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata); 120697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1); 120797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 120897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focalLength = 120997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata); 121097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1); 121197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 121297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusDistance = 121397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata); 121497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1); 121597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 121697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole float *focusRange = 121797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata); 121897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1); 121997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *opticalStab = 12210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata); 12220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1); 122397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 122497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t *focusState = 122597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata); 122697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */ 122797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *noiseRedMode = 12290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata); 123097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1); 123197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 123297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_SCALER_CROP_REGION - check size*/ 123397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_crop_region_t *hScalerCropRegion =(cam_crop_region_t *) 123597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata); 12360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t scalerCropRegion[3]; 12370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[0] = hScalerCropRegion->left; 12380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[1] = hScalerCropRegion->top; 12390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion[2] = hScalerCropRegion->width; 12400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 3); 124197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 124297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorExpTime = 124397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata); 124497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1); 124597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 124697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int64_t *sensorFameDuration = 124797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata); 124897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1); 124997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 125097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int32_t *sensorSensitivity = 125197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata); 125297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1); 125397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *shadingMode = 12550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata); 125697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1); 125797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *faceDetectMode = 12590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata); 126097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1); 126197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *histogramMode = 12630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata); 126497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1); 126597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 12660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t *sharpnessMapMode = 12670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata); 126897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE, 126997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole sharpnessMapMode, 1); 127097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 127197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/ 127297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole cam_sharpness_map_t *sharpnessMap = (cam_sharpness_map_t *) 127397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata); 127497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP, 127597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole (int32_t*)sharpnessMap->sharpness, 127697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT); 127797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 127897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole resultMetadata = camMetadata.release(); 127933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang return resultMetadata; 128097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 128197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 128297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 128397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : convertRegions 128497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 128597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array 128697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 128797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 128897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @rect : cam_rect_t struct to convert 128997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @region : int32_t destination array 129097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @weight : if we are converting from cam_area_t, weight is valid 129197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * else weight = -1 129297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 129397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 129497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertRegions(cam_rect_t rect, int32_t* region, int weight){ 129597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[0] = rect.left; 129697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[1] = rect.top; 129797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[2] = rect.width; 129897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[3] = rect.height; 129997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (weight > -1) { 130097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole region[4] = weight; 130197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 130297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 130397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole/*=========================================================================== 130497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * FUNCTION : convertLandmarks 130597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 130697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * DESCRIPTION: helper method to extract the landmarks from face detection info 130797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 130897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * PARAMETERS : 130997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @face : cam_rect_t struct to convert 131097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * @landmarks : int32_t destination array 131197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 131297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole * 131397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole *==========================================================================*/ 131497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolevoid QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks) 131597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole{ 131697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[0] = face.left_eye_center.x; 131797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[1] = face.left_eye_center.y; 131897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[2] = face.right_eye_center.y; 131997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[3] = face.right_eye_center.y; 132097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[4] = face.mouth_center.x; 132197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole landmarks[5] = face.mouth_center.y; 132297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole} 132397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 1324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 1325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 1327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 1329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 1335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 1336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 1338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 1340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 1341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 1342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 1344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 1345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 1346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 1347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 1348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1350e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 1351e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (capabilityHeap == NULL) { 1352e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: creation of capabilityHeap failed", __func__); 1353e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang goto heap_creation_failed; 1354e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 1356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 1357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 1358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 1359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 1360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 1363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 1364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 1365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 1366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 1367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 1370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 1371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 1374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 1375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 1376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 1377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 1380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 1381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 1382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 1383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 1385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 1386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 1387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 1389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 1390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 1391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 1392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 1393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 1394e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete capabilityHeap; 1395e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed: 1396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 1397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 1398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 1399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1403662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : initParameters 1404662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1405662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: initialize camera parameters 1406662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1407662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1408662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1409662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1410662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 1411662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1412662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1413662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::initParameters() 1414662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1415662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 1416662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1417662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Allocate Set Param Buffer 1418662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = new QCamera3HeapMemory(); 1419662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 1420662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc != OK) { 1421662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = NO_MEMORY; 1422662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("Failed to allocate SETPARM Heap memory"); 1423662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1424662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1425662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1426662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1427662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1428662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //Map memory for parameters buffer 1429662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 1430662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole CAM_MAPPING_BUF_TYPE_PARM_BUF, 1431662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->getFd(0), 1432662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(parm_buffer_t)); 1433662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(rc < 0) { 1434662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:failed to map SETPARM buffer",__func__); 1435662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = FAILED_TRANSACTION; 1436662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap->deallocate(); 1437662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole delete mParamHeap; 1438662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParamHeap = NULL; 1439662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1440662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1441662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1442662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0); 1443662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 1444662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 1445662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1446662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 144733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * FUNCTION : deinitParameters 144833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 144933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * DESCRIPTION: de-initialize camera parameters 145033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 145133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * PARAMETERS : 145233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * 145333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang * RETURN : NONE 145433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang *==========================================================================*/ 145533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wangvoid QCamera3HardwareInterface::deinitParameters() 145633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang{ 145733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 145833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF); 145933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 146033cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap->deallocate(); 146133cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang delete mParamHeap; 146233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParamHeap = NULL; 146333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 146433cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters = NULL; 146533cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang} 146633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 146733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang/*=========================================================================== 1468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 1469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1470625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 1471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 1474625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1475625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 1476625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 1477625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 1478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1479625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 1480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 148297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata staticInfo; 1483662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK; 1484662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 3 only*/ 1485662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole #ifdef HAL_3_CAPABILITIES 1486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 1487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); 1488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1489625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 1490625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 1491625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1492625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 1493625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths, 1494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths_count); 1495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1496625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 1498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 1499625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 1500625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 1502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 1503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 1504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1505625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 1507625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang (int*)gCamCapability[cameraId]->optical_stab_modes, 1508625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 1509625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 151080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 151180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 151280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 151380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 151480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 151580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 151680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 151780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 151880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 1519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 152080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map, 15210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(gCamCapability[cameraId]->lens_shading_map)/ sizeof(float)); 1522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 152380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 15240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->geo_correction_map_size.height}; 152580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 152680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 152780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 152880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 152980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 153080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 15310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geo_correction_map)/sizeof(float)); 153280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 153380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 153480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 153580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 153680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 153780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 153880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 153980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 154080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 154180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 154280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 154380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 154480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (int*)&gCamCapability[cameraId]->color_arrangement, 1); 154580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 154680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 154780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 154880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 154980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 155080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 155180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width, 155280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 155380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 155480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang active_array_size, 2); 155580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 155680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 155780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 1558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 155980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 156080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 156180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 156280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 156380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 156480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 156580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 156680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 156780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 156880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 156980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (int*)&gCamCapability[cameraId]->max_face_detection_count, 1); 157080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 157180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 157280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 157380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 157480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 157580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 157680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 157780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 157880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 157980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 158080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 158180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 158280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 158380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 158480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 158580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 158680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 158780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 158880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 158980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 159080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1591662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t scalar_formats[CAM_FORMAT_MAX]; 1592662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scalar_format_cnt; i++) { 1593662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats[i] = getScalarFormat(gCamCapability[cameraId]->supported_scalar_fmts[i]); 1594662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1595662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 1596662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole scalar_formats, 15970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_scalar_format_cnt); 1598662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1599662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t available_processed_sizes[CAM_FORMAT_MAX]; 1600662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole makeTable(gCamCapability[cameraId]->supported_sizes_tbl, 1601662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->supported_sizes_tbl_cnt, 1602662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes); 1603662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 1604662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_processed_sizes, 16050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_sizes_tbl_cnt); 16060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 16070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole static float available_fps_ranges[gCamCapability[cameraId]->fps_ranges_tbl_cnt]; 16080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl, 16090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->fps_ranges_tbl_cnt, 16100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole available_fps_ranges); 1611662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole #else 1612662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const float minFocusDistance = 0; 1613662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 1614662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &minFocusDistance, 1); 1615662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1616662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const float hyperFocusDistance = 0; 1617662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 1618662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &hyperFocusDistance, 1); 1619662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1620662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float focalLength = 3.30f; 1621662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 1622662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &focalLength, 1623662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1); 1624662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1625662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float aperture = 2.8f; 1626662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 1627662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &aperture, 1628662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1); 1629662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1630662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float filterDensity = 0; 1631662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 1632662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &filterDensity, 1); 1633662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1634662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableOpticalStabilization = 1635662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; 1636662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 1637662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &availableOpticalStabilization, 1); 1638662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1639662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole float lensPosition[3]; 1640662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (facingBack) { 1641662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole // Back-facing camera is center-top on device 1642662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[0] = 0; 1643662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[1] = 20; 1644662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[2] = -5; 1645662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 1646662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole // Front-facing camera is center-right on device 1647662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[0] = 20; 1648662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[1] = 20; 1649662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition[2] = 0; 1650662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1651662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_POSITION, 1652662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensPosition, 1653662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(lensPosition)/ sizeof(float)); 1654662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1655662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t lensShadingMapSize[] = {1, 1}; 1656662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 1657662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensShadingMapSize, 1658662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(lensShadingMapSize)/sizeof(int32_t)); 1659662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1660662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float lensShadingMap[3 * 1 * 1 ] = 1661662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole { 1.f, 1.f, 1.f }; 1662662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, 1663662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole lensShadingMap, 1664662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(lensShadingMap)/ sizeof(float)); 1665662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1666662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t geometricCorrectionMapSize[] = {2, 2}; 1667662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 1668662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole geometricCorrectionMapSize, 1669662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(geometricCorrectionMapSize)/sizeof(int32_t)); 1670662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1671662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float geometricCorrectionMap[2 * 3 * 2 * 2] = { 1672662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 1673662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1674662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 1675662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1.f, 1.f, 1.f, 1.f, 1.f, 1.f}; 1676662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 1677662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole geometricCorrectionMap, 1678662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(geometricCorrectionMap)/ sizeof(float)); 1679662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1680662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const float sensorPhysicalSize[2] = {3.20f, 2.40f}; 1681662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 1682662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sensorPhysicalSize, 2); 1683662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1684662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const int64_t exposureTimeRange[2] = {1000L, 30000000000L} ; // 1 us - 30 sec 1685662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 1686662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole exposureTimeRange, 2); 1687662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1688662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const int64_t frameDurationRange[2] = {33331760L, 30000000000L}; 1689662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 1690662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole frameDurationRange, 1); 1691662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1692662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const uint8_t colorFilterArrangement = 1693662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB; 1694662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 1695662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &colorFilterArrangement, 1); 1696662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1697662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const int resolution[2] = {640, 480}; 1698662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 1699662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole resolution, 2); 1700662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1701662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 1702662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole resolution, 2); 1703662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1704662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const uint32_t whiteLevel = 4000; 1705662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 1706662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (int32_t*)&whiteLevel, 1); 1707662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1708662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t blackLevelPattern[4] = { 1709662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1000, 1000, 1710662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1000, 1000 }; 1711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 1712662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole blackLevelPattern, 4); 1713662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1714662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int64_t flashChargeDuration = 0; 1715662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 1716662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &flashChargeDuration, 1); 1717662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1718662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t tonemapCurvePoints = 128; 1719662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 1720662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &tonemapCurvePoints, 1); 1721662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 17221c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole static const int32_t maxFaceCount = 0; 1723662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 1724662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &maxFaceCount, 1); 1725662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1726662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t histogramSize = 64; 1727662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 1728662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &histogramSize, 1); 1729662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1730662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t maxHistogramCount = 1000; 1731662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 1732662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &maxHistogramCount, 1); 1733662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1734662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t sharpnessMapSize[2] = {64, 64}; 1735662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 1736662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sharpnessMapSize, sizeof(sharpnessMapSize)/sizeof(int32_t)); 1737662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1738662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t maxSharpnessMapValue = 1000; 1739662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 1740662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &maxSharpnessMapValue, 1); 1741662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1742662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF}; 1743662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 1744662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableVstabModes, sizeof(availableVstabModes)); 1745662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1746662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const uint64_t availableRawMinDurations[1] = {33331760L}; 1747662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 1748662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (int64_t*)&availableRawMinDurations, 1749662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1); 1750662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1751662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const uint32_t availableFormats[4] = { 1752662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole HAL_PIXEL_FORMAT_RAW_SENSOR, 1753662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole HAL_PIXEL_FORMAT_BLOB, 1754662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole HAL_PIXEL_FORMAT_RGBA_8888, 1755662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole HAL_PIXEL_FORMAT_YCrCb_420_SP 1756662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole }; 1757662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS, 1758662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (int32_t*)availableFormats, 1759662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 4); 1760662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 17611c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole const uint32_t availableProcessedSizes[4] = {1280, 720, 640, 480}; 1762662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 1763662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (int32_t*)availableProcessedSizes, 1764662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(availableProcessedSizes)/sizeof(int32_t)); 1765662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1766662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 1767662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole resolution, 1768662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(resolution)/sizeof(int)); 1769662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1770662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableFaceDetectModes[] = { 1771662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_STATISTICS_FACE_DETECT_MODE_OFF }; 1772662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1773662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 1774662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableFaceDetectModes, 1775662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(availableFaceDetectModes)); 1776662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1777662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableSceneModes[] = { 1778662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED }; 1779662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1780662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 1781662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableSceneModes, sizeof(availableSceneModes)); 1782662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1783662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t availableFpsRanges[] = {15, 30}; 1784662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 1785662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableFpsRanges, sizeof(availableFpsRanges)/sizeof(int32_t)); 1786662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1787662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableEffectsModes[] = { 1788662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_CONTROL_EFFECT_MODE_OFF }; 1789662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 1790662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableEffectsModes, sizeof(availableEffectsModes)); 1791662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1792662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t availableAntibandingModes[] = { 1793662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF }; 1794662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 1795662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole availableAntibandingModes, sizeof(availableAntibandingModes)); 1796662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1797662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t flashAvailable = 0; 1798662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE, 1799662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &flashAvailable, sizeof(flashAvailable)); 1800662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1801662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t max3aRegions = 0; 1802662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_MAX_REGIONS, 1803662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &max3aRegions, 1); 1804662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1805662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const camera_metadata_rational exposureCompensationStep = { 1806662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1, 3 1807662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole }; 1808662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1809662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &exposureCompensationStep, 1); 1810662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1811662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t jpegThumbnailSizes[] = { 1812662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 0, 0, 1813662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 160, 120, 1814662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 320, 240 1815662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole }; 1816662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 1817662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpegThumbnailSizes, sizeof(jpegThumbnailSizes)/sizeof(int32_t)); 1818662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1819662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t maxZoom = 10; 1820662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, 1821662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole &maxZoom, 1); 1822662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1823662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int64_t jpegMinDuration[] = {33331760L, 30000000000L}; 1824662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS, 1825662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpegMinDuration, 1826662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(jpegMinDuration)/sizeof(uint64_t)); 1827662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole #endif 1828662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*HAL 1 and HAL 3 common*/ 1829662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width, 1830662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->raw_dim.height}; 1831662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES, 1832662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole raw_size, 1833662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(raw_size)/sizeof(uint32_t)); 1834662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 183580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 183680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 183780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 183880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 183980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 184080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1841662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint8_t lensFacing = (facingBack) ? 184280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 184380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 1844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1845662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static int32_t available_jpeg_sizes[MAX_SIZES_CNT]; 1846662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole makeTable(gCamCapability[cameraId]->picture_sizes_tbl, 1847662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole gCamCapability[cameraId]->picture_sizes_tbl_cnt, 1848662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_jpeg_sizes); 1849662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 1850662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole available_jpeg_sizes, 18510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->picture_sizes_tbl_cnt); 1852662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 185397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole static int32_t max_jpeg_size = 0; 185497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole int temp_width, temp_height; 185597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) { 185697e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width; 185797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height; 185897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole if (temp_width * temp_height > max_jpeg_size ) { 185997e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = temp_width * temp_height; 186097e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 186197e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole } 186297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t); 186397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole staticInfo.update(ANDROID_JPEG_MAX_SIZE, 186497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole &max_jpeg_size, 1); 186597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 18660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole static uint8_t avail_effects[CAM_EFFECT_MODE_MAX]; 18670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t size = 0; 1868662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) { 18690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(EFFECT_MODES_MAP, 1870b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]), 18710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_effects[i]); 18720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 18730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_effects[size] = (uint8_t)val; 18740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 18750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1876662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1877662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS, 1878662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_effects, 18790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1880662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 18810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole static uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX]; 18820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1883662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) { 18840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(SCENE_MODES_MAP, 1885b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]), 18860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_scene_modes[i]); 18870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 18880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_scene_modes[size] = (uint8_t)val; 18890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 18900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1891662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1892662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 1893662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_scene_modes, 18940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1895662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 18960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole static uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX]; 18970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1898662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) { 18990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(ANTIBANDING_MODES_MAP, 1900b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]), 1901b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[cameraId]->supported_antibandings[i]); 19020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 19030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_antibanding_modes[size] = (uint8_t)val; 19040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 19050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 19060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 1907662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1908662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 1909662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_antibanding_modes, 19100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1911662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1912b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang ALOGE("%s: %d", __func__, __LINE__); 1913662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX]; 19140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1915662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) { 19160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FOCUS_MODES_MAP, 1917b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]), 19180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_focus_modes[i]); 19190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 19200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_af_modes[size] = (uint8_t)val; 19210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 19220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1923662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1924662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES, 1925662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_af_modes, 19260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1927662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 19280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole static uint8_t avail_awb_modes[CAM_WB_MODE_MAX]; 19290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1930662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) { 19310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP, 1932b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]), 19330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_white_balances[i]); 19340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 19350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_awb_modes[size] = (uint8_t)val; 19360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 19370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1938662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1939662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 1940662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_awb_modes, 19410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1942662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 19430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole static uint8_t avail_flash_modes[CAM_FLASH_MODE_MAX]; 19440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size = 0; 1945662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) { 19460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int val = lookupFwkName(FLASH_MODES_MAP, 1947b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(FLASH_MODES_MAP)/sizeof(FLASH_MODES_MAP[0]), 19480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole gCamCapability[cameraId]->supported_flash_modes[i]); 19490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (val != NAME_NOT_FOUND) { 19500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole avail_flash_modes[size] = (uint8_t)val; 19510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size++; 19520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 1953662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1954662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_FLASH_MODE, 1955662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_flash_modes, 19560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole size); 1957662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1958662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*so far fwk seems to support only 2 aec modes on and off*/ 1959662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole static const uint8_t avail_ae_modes[] = { 1960662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_CONTROL_AE_MODE_OFF, 1961662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ANDROID_CONTROL_AE_MODE_ON 1962662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole }; 1963662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES, 1964662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole avail_ae_modes, 1965662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(avail_ae_modes)); 1966662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 1967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gStaticMetadata = staticInfo.release(); 1968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1971625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1972662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : makeTable 1973662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1974662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: make a table of sizes 1975662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1976662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 1977662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1978662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1979662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 1980662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 1981662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 1982662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 1983662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 1984662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbolevoid QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size, 1985662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t* sizeTable) 1986662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 1987662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int j = 0; 1988662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < size; i++) { 1989662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j] = dimTable[i].width; 1990662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeTable[j+1] = dimTable[i].height; 1991662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole j+=2; 1992662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 1993662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 19940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 19950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole/*=========================================================================== 19960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : makeFPSTable 19970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 19980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: make a table of fps ranges 19990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 20000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * PARAMETERS : 20010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 20020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 20030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * 20040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * RETURN : int32_t type of status 20050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * NO_ERROR -- success 20060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * none-zero failure code 20070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole *==========================================================================*/ 20080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbolevoid QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size, 20090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float* fpsRangesTable) 20100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole{ 20110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int j = 0; 20120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < size; i++) { 20130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fpsRangesTable[j] = fpsTable[i].min_fps; 20140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fpsRangesTable[j+1] = fpsTable[i].max_fps; 20150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole j+=2; 20160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 20170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole} 2018662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2019662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : getPreviewHalPixelFormat 2020662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2021662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: convert the format to type recognized by framework 2022662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2023662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : format : the format from backend 2024662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2025662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ** RETURN : format recognized by framework 2026662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2027662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2028662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::getScalarFormat(int32_t format) 2029662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2030662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int32_t halPixelFormat; 2031662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2032662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole switch (format) { 2033662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV12: 2034662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP; 2035662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2036662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21: 2037662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2038662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2039662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_NV21_ADRENO: 2040662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO; 2041662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2042662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_420_YV12: 2043662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YV12; 2044662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2045662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV16: 2046662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole case CAM_FORMAT_YUV_422_NV61: 2047662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole default: 2048662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP; 2049662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole break; 2050662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2051662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return halPixelFormat; 2052662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2053662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2054662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2055662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : AddSetParmEntryToBatch 2056662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2057662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: add set parameter entry into batch 2058662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2059662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2060662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @p_table : ptr to parameter buffer 2061662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramType : parameter type 2062662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramLength : length of parameter value 2063662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @paramValue : ptr to parameter value 2064662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2065662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2066662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * NO_ERROR -- success 2067662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2068662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2069662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table, 2070662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole cam_intf_parm_type_t paramType, 2071662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole uint32_t paramLength, 2072662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole void *paramValue) 2073662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2074662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int position = paramType; 2075662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int current, next; 2076662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2077662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2078662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Code to take care of linking next flags * 2079662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2080662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_FIRST_PARAM_ID(p_table); 2081662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position == current){ 2082662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole //DO NOTHING 2083662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else if (position < current){ 2084662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, current); 2085662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_FIRST_PARAM_ID(p_table, position); 2086662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } else { 2087662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /* Search for the position in the linked list where we need to slot in*/ 2088662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole while (position > GET_NEXT_PARAM_ID(current, p_table)) 2089662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole current = GET_NEXT_PARAM_ID(current, p_table); 2090662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2091662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*If node already exists no need to alter linking*/ 2092662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (position != GET_NEXT_PARAM_ID(current, p_table)) { 2093662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole next = GET_NEXT_PARAM_ID(current, p_table); 2094662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(current, p_table, position); 2095662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole SET_NEXT_PARAM_ID(position, p_table, next); 2096662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2097662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2098662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2099662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /************************************************************************* 2100662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * Copy contents into entry * 2101662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *************************************************************************/ 2102662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2103662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (paramLength > sizeof(parm_type_t)) { 2104662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s:Size of input larger than max entry size",__func__); 2105662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2106662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2107662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength); 2108662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NO_ERROR; 2109662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2110662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2111662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2112662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupFwkName 2113662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2114662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2115662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2116662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2117662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2118662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2119662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2120662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @hal_name : name of the hal_parm to map 2121662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2122662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int type of status 2123662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * fwk_name -- success 2124662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2125662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 21260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[], 2127662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int hal_name) 2128662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2129662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2130662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 2131662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].hal_name == hal_name) 2132662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].fwk_name; 2133662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 21340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Cannot find matching framework type", __func__); 21350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole return NAME_NOT_FOUND; 2136662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2137662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2138662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2139662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * FUNCTION : lookupHalName 2140662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2141662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * DESCRIPTION: In case the enum is not same in fwk and backend 2142662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * make sure the parameter is correctly propogated 2143662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2144662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2145662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @arr : map between the two enums 2146662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @len : len of the map 2147662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @fwk_name : name of the hal_parm to map 2148662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2149662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : int32_t type of status 2150662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * hal_name -- success 2151662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * none-zero failure code 2152662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 21530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godboleint8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[], 2154662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int len, int fwk_name) 2155662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2156662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole for (int i = 0; i < len; i++) { 2157662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (arr[i].fwk_name == fwk_name) 2158662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return arr[i].hal_name; 2159662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 21600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole ALOGE("%s: Cannot find matching hal type", __func__); 2161662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return NAME_NOT_FOUND; 2162662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2163662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2164662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 2165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 2166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 2168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 2171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 2172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 2174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 2175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 2176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 2178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 2179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 2181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 2183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 2184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 2186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gStaticMetadata) { 2191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 2192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 2193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 2198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 2199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 2200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 2203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 2204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 2208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 2209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 2214e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0); 2215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->static_camera_characteristics = gStaticMetadata; 2216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 2218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 2222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 2224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 2226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 2229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 2230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 223297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbolecamera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type) 2233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2234e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 2235e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 2237e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 2241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 224297e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata settings; 2243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 2244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 2245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 2246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 2248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 2250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 2251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 2252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 2253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 2255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 2256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 2258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 2259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 2261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 2262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 2264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 2265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 2267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 2268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 2269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 2271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 22729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 22739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 2274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 2276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 2277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 2279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 2280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 2282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 2283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 2285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 2286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 2288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 2289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 2291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 2292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 2294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 2295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 2296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 2299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_aperture = gCamCapability[mCameraId]->apertures[0]; 2300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 2301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2302b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang if (gCamCapability[mCameraId]->filter_densities_count) { 2303b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 2304b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 2305b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang gCamCapability[mCameraId]->filter_densities_count); 2306b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang } 2307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2308b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang /* TODO: Enable focus lengths once supported*/ 2309b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang /*if (gCamCapability[mCameraId]->focal_lengths_count) { 2310b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0]; 2311b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 2312b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang }*/ 2313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 2315e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2316e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 2318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 232180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 232280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 232380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 232480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 232580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 232680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 232780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 232880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 232980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 233080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 233180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 233280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 2333662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::setFrameParameters(int frame_id, 2334662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole const camera_metadata_t *settings) 233580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 233680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 233780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 233833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang if (settings == NULL && mFirstRequest) { 233980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 234080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 2341662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 234233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2343b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang int32_t hal_version = CAM_HAL_V3; 2344b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang 2345b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 234633cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang mParameters->first_flagged_entry = CAM_INTF_PARM_MAX; 2347b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION, 2348b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wang sizeof(hal_version), &hal_version); 234933cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang 2350662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole /*we need to update the frame number in the parameters*/ 2351662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 2352662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole sizeof(frame_id), &frame_id); 2353662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (rc < 0) { 2354662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole ALOGE("%s: Failed to set the frame number in the parameters", __func__); 2355662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return BAD_VALUE; 2356662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 23570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 2358662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if(settings != NULL){ 23591c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = translateMetadataToParameters(settings); 236080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 236180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 236233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang ALOGE("%s: %d", __func__, __LINE__); 2363662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters); 236480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 236580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 236680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 236780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 236880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 236980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 237080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 237180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 237280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 237380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 237480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 237580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 237680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 237780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 237880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 237980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 238080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 238180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (const camera_metadata_t *settings) 238280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 2383662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole int rc = 0; 238497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata frame_settings; 2385662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole frame_settings = settings; 2386662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 23870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 23880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) { 23890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t antibandingMode = 23900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0]; 23910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING, 23920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(antibandingMode), &antibandingMode); 23930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 239497e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 239597e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole /*int32_t expCompensation = frame_settings.find().data.i32[0]; 23960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION, 239797e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole sizeof(expCompensation), &expCompensation);*/ 23980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) { 23990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0]; 24000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK, 24010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeLock), &aeLock); 24020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 240397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 24040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) { 24050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_fps_range_t fps_range; 24060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.min_fps = 24070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 24080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fps_range.max_fps = 24090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0]; 24100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE, 24110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(fps_range), &fps_range); 24120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 241397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole 24140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) { 24150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t focusMode = 24160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0]; 24170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE, 24180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focusMode), &focusMode); 24190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2420662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 24210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) { 24220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t awbLock = 24230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0]; 24240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK, 24250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(awbLock), &awbLock); 24260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) { 24290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_whiteLevel = 24300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0]; 24310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP, 24320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(WHITE_BALANCE_MODES_MAP), 24330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_whiteLevel); 24340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE, 24350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(whiteLevel), &whiteLevel); 24360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) { 24390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_effectMode = 24400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0]; 24410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP, 24420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(EFFECT_MODES_MAP), 24430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_effectMode); 24440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT, 24450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(effectMode), &effectMode); 24460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) { 24490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t fwk_aeMode = 24500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0]; 24510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t aeMode = lookupHalName(AUTO_EXPOSURE_MAP, 24520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(AUTO_EXPOSURE_MAP), 24530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole fwk_aeMode); 24540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE, 24550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(aeMode), &aeMode); 24560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_REQUEST_FRAME_COUNT)) { 24590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t metaFrameNumber = 24600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_REQUEST_FRAME_COUNT).data.i32[0]; 24610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER, 24620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(metaFrameNumber), &metaFrameNumber); 24630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) { 24660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t colorCorrectMode = 24670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0]; 24680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = 24690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE, 24700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(colorCorrectMode), &colorCorrectMode); 24710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole uint8_t aecTrigger = CAM_AEC_TRIGGER_IDLE; 24740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)) { 24751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole aecTrigger = 24760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0]; 24770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER, 24791c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole sizeof(aecTrigger), &aecTrigger); 24800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER)) { 24820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t afTrigger = 24830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0]; 24840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 24850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_AF_TRIGGER, sizeof(afTrigger), &afTrigger); 24860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_MODE)) { 24890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0]; 24900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE, 24910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(metaMode), &metaMode); 24920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 24930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 24940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) { 24950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t demosaic = 24960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0]; 24970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC, 24980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(demosaic), &demosaic); 24990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_MODE)) { 25020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0]; 25030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE, 25040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(edgeMode), &edgeMode); 25050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) { 25080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t edgeStrength = 25090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0]; 25100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength); 25120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) { 25150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t flashPower = 25160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0]; 25170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER, 25180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(flashPower), &flashPower); 25190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) { 25220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t flashFiringTime = 25230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0]; 25240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime); 25260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) { 25290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t geometricMode = 25300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0]; 25310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE, 25320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricMode), &geometricMode); 25330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) { 25360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t geometricStrength = 25370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0]; 25380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_GEOMETRIC_STRENGTH, 25400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(geometricStrength), &geometricStrength); 25410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) { 25440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t hotPixelMode = 25450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0]; 25460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE, 25470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(hotPixelMode), &hotPixelMode); 25480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_APERTURE)) { 25510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float lensAperture = 25520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find( ANDROID_LENS_APERTURE).data.f[0]; 25530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE, 25540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(lensAperture), &lensAperture); 25550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) { 25580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float filterDensity = 25590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0]; 25600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY, 25610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(filterDensity), &filterDensity); 25620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 25650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float focalLength = 25660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 25670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_FOCAL_LENGTH, 25690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focalLength), &focalLength); 25700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) { 25730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole float focalDistance = 25740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0]; 25750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_FOCUS_DISTANCE, 25770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(focalDistance), &focalDistance); 25780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) { 25810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t optStabMode = 25820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0]; 25830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_LENS_OPT_STAB_MODE, 25850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(optStabMode), &optStabMode); 25860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) { 25890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedMode = 25900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0]; 25910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 25920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_MODE, 25930e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedMode), &noiseRedMode); 25940e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 25950e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 25960e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) { 25970e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t noiseRedStrength = 25980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0]; 25990e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_NOISE_REDUCTION_STRENGTH, 26010e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(noiseRedStrength), &noiseRedStrength); 26020e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26030e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26040e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) { 26050e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole cam_crop_region_t scalerCropRegion; 26060e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.left = 26070e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0]; 26080e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.top = 26090e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1]; 26100e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole scalerCropRegion.width = 26110e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2]; 26120e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26130e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SCALER_CROP_REGION, 26140e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(scalerCropRegion), &scalerCropRegion); 26150e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26160e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26170e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) { 26180e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorExpTime = 26190e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0]; 26200e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_EXPOSURE_TIME, 26220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorExpTime), &sensorExpTime); 26230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) { 26260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int64_t sensorFrameDuration = 26270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0]; 26280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_FRAME_DURATION, 26300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorFrameDuration), &sensorFrameDuration); 26310e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 26340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t sensorSensitivity = 26350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 26360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_SENSOR_SENSITIVITY, 26380e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sensorSensitivity), &sensorSensitivity); 26390e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_MODE)) { 26420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole int32_t shadingMode = 26430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_MODE).data.u8[0]; 26440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE, 26450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingMode), &shadingMode); 26460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) { 26490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t shadingStrength = 26500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0]; 26510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH, 26520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(shadingStrength), &shadingStrength); 26530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) { 26560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t facedetectMode = 26570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0]; 26580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_FACEDETECT_MODE, 26600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(facedetectMode), &facedetectMode); 26610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) { 26640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t histogramMode = 26650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0]; 26660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26670e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_HISTOGRAM_MODE, 26680e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(histogramMode), &histogramMode); 26690e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26700e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26710e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) { 26720e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t sharpnessMapMode = 26730e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0]; 26740e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26750e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, 26760e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(sharpnessMapMode), &sharpnessMapMode); 26770e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26780e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26790e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_TONEMAP_MODE)) { 26800e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t tonemapMode = 26810e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0]; 26820e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, 26830e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole CAM_INTF_META_TONEMAP_MODE, 26840e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(tonemapMode), &tonemapMode); 26850e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 26860e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 26870e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) { 26880e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole uint8_t captureIntent = 26890e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0]; 26900e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT, 26910e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole sizeof(captureIntent), &captureIntent); 26920e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 2693662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2694662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole return rc; 2695662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole} 2696662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 2697662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole/*=========================================================================== 26980e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * FUNCTION : getJpegSettings 2699662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 27000e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole * DESCRIPTION: save the jpeg settings in the HAL 2701662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2702662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2703662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * PARAMETERS : 2704662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * @settings : frame settings information from framework 2705662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2706662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * 2707662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * RETURN : success: NO_ERROR 2708662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole * failure: 2709662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole *==========================================================================*/ 2710662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godboleint QCamera3HardwareInterface::getJpegSettings 2711662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole (const camera_metadata_t *settings) 2712662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole{ 2713662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole if (mJpegSettings) { 2714662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole free(mJpegSettings); 2715662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = NULL; 2716662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole } 2717662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t)); 271897e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole CameraMetadata jpeg_settings; 2719662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole jpeg_settings = settings; 2720662d6f3c8101a94f45f3b0f892817e062a5c0faaTanmaya Godbole 27210e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) { 27220e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 27230e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0]; 27240e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 27250e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_orientation = 0; 27260e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27270e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) { 27280e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->jpeg_quality = 27290e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0]; 27300e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 27311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mJpegSettings->jpeg_quality = 85; 27320e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27330e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) { 27340e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.width = 27350e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0]; 27360e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.height = 27370e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1]; 2738f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mJpegSettings->thumbnail_size.width = 320; 2739f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mJpegSettings->thumbnail_size.height = 240; 27400e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } else { 27410e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.width = 640; 27420e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->thumbnail_size.height = 480; 27430e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27440e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) { 27450e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole for (int i = 0; i < 3; i++) { 27460e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->gps_coordinates[i] = 27470e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i]; 27480e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27490e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27500e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) { 27510e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->gps_timestamp = 27520e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0]; 27530e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27540e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole 27550e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) { 27560e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->gps_processing_method = 27570e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[0]; 27580e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27590e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) { 27600e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->sensor_sensitivity = 27610e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0]; 27620e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 27630e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) { 27640e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole mJpegSettings->lens_focal_length = 27650e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0]; 27660e03eb09035f20fd3e45ad4b6be5eb84303377deTanmaya Godbole } 276780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 276880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 276980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 277080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 2771e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 2772625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2773625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 2774625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 2777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 2778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 2779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 2781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 27821c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbolevoid QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata, 2783e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, 2784e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frame_number, void *userdata) 2785625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 2787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 2788625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 2789625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 2790625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2791625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2792e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->captureResultCb(metadata, buffer, frame_number); 2793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 2794625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2797625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 2798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 2800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2801625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2802625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2803625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2804625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 2805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 2806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 2809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 2810625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 28111c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: E", __func__); 2812625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 2813625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2814625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 2815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2816625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 2817625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2818625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 28191c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->initialize(callback_ops); 28201c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: X", __func__); 28211c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 2822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 2826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 2828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 2833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 2834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 2835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 2838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 2839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 2840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 28411c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: E", __func__); 2842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 2843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 2845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 2847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 28481c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->configureStreams(stream_list); 28491c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: X", __func__); 28501c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 2851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 2855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 2857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 2861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 2863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 2864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 2865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 28661c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: E", __func__); 2867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 2868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 2870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 2872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 28731c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->registerStreamBuffers(buffer_set); 28741c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: X", __func__); 28751c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 2876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 2880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 2882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 2887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 2888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 28899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 28909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 28919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 2892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2893625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 28941c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: E", __func__); 2895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 2896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 2897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 2899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 2901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 290397e8019457b448a6e2141a49a0f471a467b70dc0Tanmaya Godbole fwk_metadata = hw->translateCapabilityToMetadata(type); 2904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 29051c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: X", __func__); 2906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 2907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 2911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 2913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2915625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2916625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 2918625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 29199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 29209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 29219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 2922625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 29231c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: E", __func__); 292480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 292580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 292680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 292780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 29289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 292980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 29309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 29311c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole int rc = hw->processCaptureRequest(request); 29321c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: X", __func__); 29331c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole return rc; 2934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2937625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 2938625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2939625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 2940625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2941625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2942625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2943625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2944625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 2945625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2946625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2947e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops( 2948e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, 2949e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang vendor_tag_query_ops_t* ops) 2950625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 29511c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: E", __func__); 2952e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 2953e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2954e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 2955e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2956e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2957e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 2958e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2959e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->getMetadataVendorTagOps(ops); 29601c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: X", __func__); 2961e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 2965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 2966625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 2968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 2970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2971625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 2972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 2973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 2974625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2975e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump( 2976e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, int fd) 2977625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 29781c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: E", __func__); 2979e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 2980e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 2981e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 2982e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 2983e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2984e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 2985e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2986e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->dump(fd); 29871c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: X", __func__); 2988e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 2989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 2990625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2991e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 2992e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : close_camera_device 2993e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2994e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 2995e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2996e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 2997e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2998e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 2999e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 3000e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 3001e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 3002e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 30031c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: E", __func__); 3004e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int ret = NO_ERROR; 3005e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 3006e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>( 3007e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<camera3_device_t *>(device)->priv); 3008e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 3009e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("NULL camera device"); 3010e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return BAD_VALUE; 3011e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 3012e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete hw; 30131c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole ALOGE("%s: X", __func__); 3014e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return ret; 3015e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 3016e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 3017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 3018