QCamera3HWI.cpp revision e6ab32d89cf169705236988f0f74309f914c88b7
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" 43625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android; 45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang//using namespace android; 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 53625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 54625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = { 55625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang initialize: QCamera3HardwareInterface::initialize, 56625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang configure_streams: QCamera3HardwareInterface::configure_streams, 57625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang register_stream_buffers: QCamera3HardwareInterface::register_stream_buffers, 58625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings, 59625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang process_capture_request: QCamera3HardwareInterface::process_capture_request, 60625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang get_metadata_vendor_tag_ops: QCamera3HardwareInterface::get_metadata_vendor_tag_ops, 61625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang dump: QCamera3HardwareInterface::dump, 62625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; 63625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 64625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 65625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 66625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3HardwareInterface 67625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 68625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface 69625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 70625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 71625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera ID 72625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 73625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 74625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 75625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId) 76625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang : mCameraId(cameraId), 77625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle(NULL), 78625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened(false), 79625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCallbackOps(NULL) 80625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 81625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 82e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0; 83e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraDevice.common.close = close_camera_device; 84625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.ops = &mCameraOps; 85625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.priv = this; 86625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->version = CAM_HAL_V3; 879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_init(&mRequestLock, NULL); 899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_init(&mRequestCond, NULL); 909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 91e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 92e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_init(&mMutex, NULL); 93625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 94625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 95625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 96625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 97625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 98625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: destructor of QCamera2HardwareInterface 99625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang closeCamera(); 107e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 108e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mRequestLock); 109e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_cond_destroy(&mRequestCond); 110e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 111e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_destroy(&mMutex); 112625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //int rc = NO_ERROR; 129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc == 0) 137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang else 139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : sendCaptureResult 195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: send completed capture result metadata buffer along with possibly 197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * completed output stream buffers to the framework 198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::sendCaptureResult(const struct camera3_callback_ops *, 204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_capture_result_t *result) 205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO - Implement 207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : notify 211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Asynchronous notification callback to framework 213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::notify(const struct camera3_callback_ops *, 222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_notify_msg_t *msg) 223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO - Implement 225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 244e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 245e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 2469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Create metadata channel and initialize it 247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 248e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraHandle->ops, captureResultCb, 249e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this); 250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mMetadataChannel == NULL) { 251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to allocate metadata channel", __func__); 2529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = -ENOMEM; 2539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err1; 2549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 2559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = mMetadataChannel->initialize(); 2569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 2579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: metadata channel initialization failed", __func__); 2589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err2; 2599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 2609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 2619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Initialize parameter heap and structure */ 2629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap = new QCamera3HeapMemory(); 2639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (mParamHeap == NULL) { 2649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: creation of mParamHeap failed", __func__); 2659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err2; 266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 267e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false); 2689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 2699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: allocation of mParamHeap failed", __func__); 2709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err3; 2719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 2729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 2739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF, 2749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap->getFd(0), sizeof(parm_buffer_t)); 2759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 2769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: map_buf failed for mParamHeap", __func__); 2779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err4; 2789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 2799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParameters = (parm_buffer_t *)DATA_PTR(mParamHeap, 0); 2809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 2819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCallbackOps = callback_ops; 282e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 283e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 2859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 2869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr4: 2879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap->deallocate(); 2889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr3: 2899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mParamHeap; 2909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap = NULL; 2919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr2: 2929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mMetadataChannel; 2939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMetadataChannel = NULL; 2949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1: 295e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 2969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 314e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 315e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 319e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 325e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 332e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *inputStream = NULL; 337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT) { 340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 342e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* TODO: Clean up no longer used streams, and maintain others if this 351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * is not the 1st time configureStreams is called */ 352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMetadataChannel->stop(); 354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_INPUT: 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_BIDIRECTIONAL: 367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang GRALLOC_USAGE_HW_CAMERA_WRITE; 369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_OUTPUT: 372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 386e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraHandle->ops, captureResultCb, 387e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this, newStream); 388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (channel == NULL) { 389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: allocation of channel failed", __func__); 390e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->priv = channel; 395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case HAL_PIXEL_FORMAT_BLOB: 397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel = new QCamera3PicChannel(mCameraHandle->camera_handle, 398e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCameraHandle->ops, captureResultCb, 399e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang &gCamCapability[mCameraId]->padding_info, this, newStream); 400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (channel == NULL) { 401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: allocation of channel failed", __func__); 402e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->priv = channel; 407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO: Add support for app consumed format? 410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 4209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 4219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Cannot reuse settings across configure call 4229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 423e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return 0; 425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 428e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : validateCaptureRequest 429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 430e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: validate a capture request from camera service 43180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 43280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 43380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 43480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 43580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 43680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 43780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 438e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::validateCaptureRequest( 4399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 44080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 44180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = NO_ERROR; 4429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 4439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 4449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 4459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 4469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 4479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 4489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 4499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 4529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 4539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 4549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 4559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 4569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 4579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 4609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 4619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 4629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 4659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //TODO 4669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Not supporting input buffer yet", __func__); 4679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 4709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 4719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 4729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 4739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 4749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 4759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 4769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 4779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 4789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 4819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 4829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 4839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 4869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 4879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 4889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 4919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 4929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 4939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 4969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 4979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 4989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 499e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 500e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 501e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 502e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 503e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : registerStreamBuffers 504e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 505e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 506e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 507e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 508e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @stream_list : streams to be configured 509e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 510e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 511e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 512e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 513e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 514e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 515e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 516e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = 0; 517e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 518e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 519e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 520e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set == NULL) { 521e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 522e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 523e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 524e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 525e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->stream == NULL) { 526e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 527e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 528e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 529e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 530e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->num_buffers < 1) { 531e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 532e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 533e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 534e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 535e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (buffer_set->buffers == NULL) { 536e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 537e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 538e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 539e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 540e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 541e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 542e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 543e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 544e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (stream->stream_type != CAMERA3_STREAM_OUTPUT) { 545e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: not yet support non output type stream", __func__); 546e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 547e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -EINVAL; 548e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 549e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 550e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 551e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 552e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 553e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENODEV; 554e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 555e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 556e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 557e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_ERROR; 558e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 559e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 560e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 561e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : processCaptureRequest 562e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 563e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: process a capture request from camera service 564e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 565e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 566e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @request : request from framework to process 567e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 568e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 569e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 570e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 571e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 572e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_request_t *request) 573e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 574e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int rc = NO_ERROR; 575e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ssize_t idx = 0; 576e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t *b; 577e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata meta; 578e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 579e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 580e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 581e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = validateCaptureRequest(request); 582e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != NO_ERROR) { 583e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: incoming request is not valid", __func__); 584e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 585e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 586e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 587e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 588e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frameNumber = request->frame_number; 589e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 59080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang rc = setFrameParameters(request->settings); 5919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 5929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: fail to set frame parameters", __func__); 593e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 5949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 5959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 597e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // Acquire all request buffers first 598e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 599e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 600e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang sp<Fence> acquireFence = new Fence(output.acquire_fence); 601e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = acquireFence->wait(Fence::TIMEOUT_NEVER); 602e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc != OK) { 603e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: fence wait failed %d", __func__, rc); 604e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 605e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 606e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 607e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 608e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 6099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 610e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMetadataChannel->request(NULL, frameNumber); 6119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 6139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 6149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 6159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 6169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 6179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 6189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 6199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 621e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = channel->request(output.buffer, frameNumber); 6229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 6239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 6249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 6269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 6279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_lock(&mRequestLock); 6289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 1; 6299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang while (mPendingRequest == 1) { 6309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_wait(&mRequestCond, &mRequestLock); 6319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 6329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_unlock(&mRequestLock); 6339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 634e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 63580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 63680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 63780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 6389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 639e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : getMetadataVendorTagOps 6409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 641e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 6429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 6439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 644e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 645e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 646e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 647e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 648e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::getMetadataVendorTagOps(vendor_tag_query_ops_t* ops) 649e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 650e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Enable locks when we eventually add Vendor Tags */ 651e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 652e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 653e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 654e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 655e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 656e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 657e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 658e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 659e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 660e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : dump 661e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 662e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 663e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 664e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 665e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 669e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump(int fd) 670e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 671e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /*Enable lock when we implement this function*/ 672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* 673e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 674e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 675e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 676e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang */ 677e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 679e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 680e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 681e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 682e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 683e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: Callback handler for all capture result (streams, as well as metadata) 684e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 685e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 686e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @metadata : metadata information 687e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 6889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 6899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 6909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 691e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::captureResultCb(metadata_buffer_t *metadata, 692e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, uint32_t frame_number) 6939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 694e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mCaptureResultLock); 695e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_capture_result_t result; 696e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 697e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 698e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (metadata) { 6999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Signal to unblock processCaptureRequest 7009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_lock(&mRequestLock); 7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 7029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_signal(&mRequestCond); 7039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_unlock(&mRequestLock); 704e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 705e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang //TODO: Add translation from metadata_buffer_t to CameraMetadata 706e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang // for now, hardcode timestamp only. 707e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang CameraMetadata camMetadata; 708e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t *frame_number = (uint32_t *)POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata); 709e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang nsecs_t captureTime = 1000000 * (*frame_number) * 33; 710e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &captureTime, 1); 711e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 712e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.result = camMetadata.release(); 713e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!result.result) { 714e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.frame_number = *frame_number; 715e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.num_output_buffers = 0; 716e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.output_buffers = NULL; 717e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 718e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 719e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang free_camera_metadata((camera_metadata_t*)result.result); 720e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 721e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } else { 722e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.result = NULL; 723e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.frame_number = frame_number; 724e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.num_output_buffers = 1; 725e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.output_buffers = buffer; 726e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCallbackOps->process_capture_result(mCallbackOps, &result); 7279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 729e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mCaptureResultLock); 7309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 7319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 7329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 747625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 748625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 749625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 759e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 760e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (capabilityHeap == NULL) { 761e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: creation of capabilityHeap failed", __func__); 762e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang goto heap_creation_failed; 763e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 764625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 765625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 766625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 767625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 769625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 770625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 771625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 772625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 773625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 774625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 782625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 785625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 788625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 789625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 790625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 791625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 794625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 797625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 801625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 802625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 803e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete capabilityHeap; 804e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangheap_creation_failed: 805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 810625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 811625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 812625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 813625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 814625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 816625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 817625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 818625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 819625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 820625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang android::CameraMetadata staticInfo; 827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); 830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths, 836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths_count); 837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang (int*)gCamCapability[cameraId]->optical_stab_modes, 850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 85280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 85380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 85480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 85580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 85680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 85780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 85880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 85980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 86080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 86280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map, 86380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_shading_map_size)/ sizeof(cam_dimension_t)); 864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 86580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 86680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map_size.height}; 86780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 86880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 86980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 87080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 87180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 87280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 87380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map_size)/ sizeof(cam_dimension_t)); 87480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 87580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 87680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 87780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 87880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 87980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 88080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 88180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 88280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 88380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 88480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 88580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 88680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (int*)&gCamCapability[cameraId]->color_arrangement, 1); 88780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 88880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 88980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 89080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 89180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 89280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 89380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width, 89480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 89580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 89680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang active_array_size, 2); 89780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 89880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 89980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 90180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 90280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 90380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 90480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 90580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 90680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 90780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 90880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 90980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 91080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 91180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (int*)&gCamCapability[cameraId]->max_face_detection_count, 1); 91280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 91380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 91480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 91580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 91680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 91780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 91880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 91980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 92080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 92180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 92280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 92380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 92480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 92580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 92680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 92780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 92880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 92980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 93080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 93180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 93280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 93380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 93480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 93580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 93680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 93780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 93880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 93980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang uint8_t lensFacing = (gCamCapability[cameraId]->position == CAM_POSITION_BACK) ? 94080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 94180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 942625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 943625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gStaticMetadata = staticInfo.release(); 944625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 945625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 946625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 947625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 948625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 949625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 950625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 951625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 952625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 953625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 954625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 955625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 956625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 957625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 959625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 960625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 966625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 971625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gStaticMetadata) { 974625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 975625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 976625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 977625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 978625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 979625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 980625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 981625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 982625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 983625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 984625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 985625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 986625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 987625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 988625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 990625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 991625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 993625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 997e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0); 998625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->static_camera_characteristics = gStaticMetadata; 999625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1000625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 1001625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1004625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 1005625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1006625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 1007625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1008625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 1009625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1010625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 1012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 1013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera_metadata_t* QCamera3HardwareInterface::translateMetadata(int type) 1016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1017e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_lock(&mMutex); 1018e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 1020e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1021625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 1022625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 1024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 1025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang android::CameraMetadata settings; 1026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 1027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 1028625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 1029625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1030625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 1031625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1032625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 1033625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 1034625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 1035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 1036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 1038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 1039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 1041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 1042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 1044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 1045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 1047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 1048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 1050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 1051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 1052625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 1054625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 10559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 10569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 1057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1058625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 1059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 1060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 1062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 1063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 1065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 1066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 1068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 1069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1070625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 1071625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 1072625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1073625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 1074625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 1075625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1076625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 1077625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 1078625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 1079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1080625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1081625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 1082625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_aperture = gCamCapability[mCameraId]->apertures[0]; 1083625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 1084625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1085625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 1086625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 1); 1087625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1088625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0]; 1089625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 1090625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1091625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 1092e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1093e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang pthread_mutex_unlock(&mMutex); 1094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 1095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 109880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 109980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 110080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 110180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 110280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 110380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 110480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 110580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 110680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 110780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 110880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 110980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 111080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(const camera_metadata_t *settings) 111180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 111280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 111380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 111480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang android::CameraMetadata frame_settings; 111580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (settings == NULL && prevSettings == NULL) { 111680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 111780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 111880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } else if (settings == NULL) { 111980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*do nothing? we have already configured the settings previously*/ 112080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } else{ 112180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang //reset the prevSettings 112280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (prevSettings != NULL) { 112380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang free(prevSettings); 112480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang prevSettings = NULL; 112580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 112680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang rc = translateMetadataToParameters(settings); 112780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 112880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 112980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 113080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 113180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 113280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 113380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 113480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 113580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 113680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 113780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 113880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 113980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 114080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 114180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 114280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 114380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 114480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 114580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 114680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (const camera_metadata_t *settings) 114780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 114880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 114980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 115080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 115180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 1152e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : captureResultCb 1153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 1155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 1158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 1159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 1160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 1162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1163e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::captureResultCb(metadata_buffer_t *metadata, 1164e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t *buffer, 1165e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t frame_number, void *userdata) 1166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 1168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 1169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 1170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 1171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1173e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->captureResultCb(metadata, buffer, frame_number); 1174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 1175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 1179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 1181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 1186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 1187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 1190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 1191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 1197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->initialize(callback_ops); 1200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 1204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 1211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 1212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 1213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 1216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 1217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 1218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 1224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->configureStreams(stream_list); 1226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 1230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 1232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 1238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 1239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 1240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 1246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->registerStreamBuffers(buffer_set); 1248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 1252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 1254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 1259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 1260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 12619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 12629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 12639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 1264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 1267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 1272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang fwk_metadata = hw->translateMetadata(type); 1275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 1277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 1281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 12899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 12909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 12919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 1292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 129380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 129480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 129580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 129680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 12979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 129880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 12999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 13009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return hw->processCaptureRequest(request); 1301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 1305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1314e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops( 1315e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, 1316e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang vendor_tag_query_ops_t* ops) 1317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1318e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 1319e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1320e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 1321e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1322e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1323e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1324e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1325e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->getMetadataVendorTagOps(ops); 1326e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 1331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1340e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangvoid QCamera3HardwareInterface::dump( 1341e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang const struct camera3_device *device, int fd) 1342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1343e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 1344e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1345e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 1346e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1347e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1348e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1349e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1350e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang hw->dump(fd); 1351e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 1352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1354e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang/*=========================================================================== 1355e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * FUNCTION : close_camera_device 1356e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1357e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * DESCRIPTION: 1358e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1359e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * PARAMETERS : 1360e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1361e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * 1362e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang * RETURN : 1363e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang *==========================================================================*/ 1364e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device) 1365e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang{ 1366e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int ret = NO_ERROR; 1367e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3HardwareInterface *hw = 1368e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>( 1369e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang reinterpret_cast<camera3_device_t *>(device)->priv); 1370e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!hw) { 1371e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("NULL camera device"); 1372e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return BAD_VALUE; 1373e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 1374e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete hw; 1375e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return ret; 1376e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang} 1377e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1378e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 1379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 1380