QCamera3HWI.cpp revision 80e50bfee66172f8a924573247aa99ee72bfe24f
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> 38625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h> 39625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3HWI.h" 40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Mem.h" 41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h" 42625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 43625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android; 44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang//using namespace android; 46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera { 47625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 48625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS]; 4980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangparm_buffer_t *prevSettings; 50625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangconst camera_metadata_t *gStaticMetadata; 51625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 53625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = { 54625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang initialize: QCamera3HardwareInterface::initialize, 55625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang configure_streams: QCamera3HardwareInterface::configure_streams, 56625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang register_stream_buffers: QCamera3HardwareInterface::register_stream_buffers, 57625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings, 58625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang process_capture_request: QCamera3HardwareInterface::process_capture_request, 59625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang get_metadata_vendor_tag_ops: QCamera3HardwareInterface::get_metadata_vendor_tag_ops, 60625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang dump: QCamera3HardwareInterface::dump, 61625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; 62625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 63625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 64625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 65625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3HardwareInterface 66625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 67625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface 68625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 69625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 70625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera ID 71625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 72625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 73625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 74625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId) 75625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang : mCameraId(cameraId), 76625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle(NULL), 77625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened(false), 78625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCallbackOps(NULL) 79625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 80625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 81625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_2_0; 82625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //mCameraDevice.common.close = close_camera_device; 83625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.ops = &mCameraOps; 84625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.priv = this; 85625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->version = CAM_HAL_V3; 86625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 87625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 88625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 89625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 90625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 91625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: destructor of QCamera2HardwareInterface 92625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 93625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 94625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 95625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 96625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 97625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 98625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 99625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang closeCamera(); 100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 111625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 112625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //int rc = NO_ERROR; 117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc == 0) 125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang else 127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : sendCaptureResult 183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: send completed capture result metadata buffer along with possibly 185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * completed output stream buffers to the framework 186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::sendCaptureResult(const struct camera3_callback_ops *, 192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_capture_result_t *result) 193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO - Implement 195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : notify 199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Asynchronous notification callback to framework 201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::notify(const struct camera3_callback_ops *, 210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_notify_msg_t *msg) 211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO - Implement 213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCallbackOps = callback_ops; 231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO:Create metadata channel and initialize it 233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle->ops, channelCbRoutine); 235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mMetadataChannel == NULL) { 236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to allocate metadata channel", __func__); 237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mMetadataChannel->initialize(); 240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *inputStream = NULL; 275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT) { 278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* TODO: Clean up no longer used streams, and maintain others if this 288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * is not the 1st time configureStreams is called */ 289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* TODO: Reconstruct/reset metadata stream/channel */ 291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_INPUT: 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_BIDIRECTIONAL: 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang GRALLOC_USAGE_HW_CAMERA_WRITE; 306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_OUTPUT: 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle->ops, channelCbRoutine, newStream); 324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (channel == NULL) { 325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: allocation of channel failed", __func__); 326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->priv = channel; 330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case HAL_PIXEL_FORMAT_BLOB: 332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel = new QCamera3PicChannel(mCameraHandle->camera_handle, 333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle->ops, channelCbRoutine, newStream); 334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (channel == NULL) { 335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: allocation of channel failed", __func__); 336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->priv = channel; 340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO: Add support for app consumed format? 343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return 0; 354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : registerStreamBuffers 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set == NULL) { 372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set->stream == NULL) { 376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set->num_buffers < 1) { 380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set->buffers == NULL) { 384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < buffer_set->num_buffers; i++) { 389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (stream->stream_type != CAMERA3_STREAM_OUTPUT) { 393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: not yet support non output type stream", __func__); 394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 40580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 40680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : processCaptureRequest 40780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 40880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: 40980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 41080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 41180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 41280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 41380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 41480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 41580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 41680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 41780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::processCaptureRequest 41880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (camera3_capture_request_t *request) 41980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 42080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*For each frame, we have to set the requested settings*/ 42180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = NO_ERROR; 42280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang rc = setFrameParameters(request->settings); 42380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*do the actual processing*/ 42480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 42580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 42680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 470625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 474625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 475625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 476625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 477625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 479625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 489625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 490625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 491625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 492625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang delete capabilityHeap; 493625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 496625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 499625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 500625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 505625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 507625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 508625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 509625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 510625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 511625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 512625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang android::CameraMetadata staticInfo; 516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); 519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths, 525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths_count); 526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 530625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 532625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 533625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 536625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang (int*)gCamCapability[cameraId]->optical_stab_modes, 539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 54180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 54280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 54380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 54480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 54580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 54680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 54780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 54880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 54980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 550625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 55180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map, 55280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_shading_map_size)/ sizeof(cam_dimension_t)); 553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 55480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 55580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map_size.height}; 55680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 55780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 55880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 55980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 56080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 56180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 56280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map_size)/ sizeof(cam_dimension_t)); 56380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 56480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 56580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 56680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 56780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 56880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 56980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 57080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 57180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 57280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 57380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 57480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 57580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (int*)&gCamCapability[cameraId]->color_arrangement, 1); 57680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 57780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 57880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 57980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 58080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 58180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 58280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width, 58380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 58480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 58580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang active_array_size, 2); 58680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 58780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 58880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 59080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 59180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 59280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 59380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 59480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 59580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 59680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 59780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 59880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 59980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 60080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (int*)&gCamCapability[cameraId]->max_face_detection_count, 1); 60180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 60280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 60380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 60480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 60580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 60680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 60780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 60880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 60980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 61080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 61180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 61280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 61380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 61480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 61580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 61680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 61780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 61880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 61980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 62080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 62180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 62280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 62380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 62480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 62580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 62680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 62780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 62880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang uint8_t lensFacing = (gCamCapability[cameraId]->position == CAM_POSITION_BACK) ? 62980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 63080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gStaticMetadata = staticInfo.release(); 633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gStaticMetadata) { 663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->static_camera_characteristics = gStaticMetadata; 688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera_metadata_t* QCamera3HardwareInterface::translateMetadata(int type) 705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang android::CameraMetadata settings; 712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 716625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 721625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 722625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 724625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &gCamCapability[mCameraId]->exposure_compensation_default, 1); 742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 747625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 748625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 749625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 760625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 761625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 762625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 763625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 764625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 765625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 766625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 767625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_aperture = gCamCapability[mCameraId]->apertures[0]; 768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 769625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 770625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 771625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 1); 772625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 773625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0]; 774625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 78180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 78280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 78380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 78480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 78580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 78680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 78780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 78880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 78980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 79080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 79180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 79280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 79380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(const camera_metadata_t *settings) 79480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 79580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 79680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 79780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang android::CameraMetadata frame_settings; 79880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (settings == NULL && prevSettings == NULL) { 79980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 80080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 80180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } else if (settings == NULL) { 80280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*do nothing? we have already configured the settings previously*/ 80380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } else{ 80480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang //reset the prevSettings 80580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (prevSettings != NULL) { 80680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang free(prevSettings); 80780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang prevSettings = NULL; 80880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 80980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang rc = translateMetadataToParameters(settings); 81080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 81180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 81280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 81380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 81480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 81580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 81680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 81780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 81880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 81980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 82080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 82180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 82280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 82380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 82480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 82580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 82680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 82780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 82880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 82980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (const camera_metadata_t *settings) 83080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 83180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 83280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 83380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 83480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : channelCbRoutine 836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::channelCbRoutine(mm_camera_buf_def_t *frame, 847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_buffer_t *buffer, void *userdata) 848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO: Gives frame and buffer to buffer aggregator. 856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->initialize(callback_ops); 883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 893625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->configureStreams(stream_list); 909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 915625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 916625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 918625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 919625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 920625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 922625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 923625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 924625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 925625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 926625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 927625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 928625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 929625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 930625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->registerStreamBuffers(buffer_set); 931625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 932625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 933625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 937625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 938625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 939625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 940625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 941625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 942625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 943625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 944625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::construct_default_request_settings 945625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang(const struct camera3_device *device, int type) 946625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 947625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 948625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 949625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 950625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 951625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 952625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 953625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 954625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 955625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 956625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang fwk_metadata = hw->translateMetadata(type); 957625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 959625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 960625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 961625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 962625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 963625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 964625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 965625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 966625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 969625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 97180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::process_capture_request(const struct camera3_device *device, 972625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_capture_request_t *request) 973625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 974625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*TODO - Implement*/ 97580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 97680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 97780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = NO_ERROR; 97880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 97980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 98080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return -ENODEV; 98180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 98280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang rc = hw->processCaptureRequest(request); 98380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 984625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 985625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 986625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 987625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 988625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 989625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 990625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 991625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 993625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 997625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(const struct camera3_device *, 998625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang vendor_tag_query_ops_t* ops) 999625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1000625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*TODO - Implement*/ 1001625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1002625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1004625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 1005625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1006625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1007625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1008625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1009625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1010625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1011625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::dump(const struct camera3_device *, int fd) 1015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*TODO - Implement*/ 1017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 1020