QCamera3HWI.cpp revision 9de643761e1282fb5af14a9249618efa9d8ac8fe
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; 869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_init(&mRequestLock, NULL); 889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_init(&mRequestCond, NULL); 899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 90625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 91625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 92625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 93625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 94625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 95625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: destructor of QCamera2HardwareInterface 96625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 97625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 98625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 99625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang closeCamera(); 104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 111625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 112625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //int rc = NO_ERROR; 121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc == 0) 129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang else 131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : sendCaptureResult 187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: send completed capture result metadata buffer along with possibly 189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * completed output stream buffers to the framework 190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::sendCaptureResult(const struct camera3_callback_ops *, 196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_capture_result_t *result) 197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO - Implement 199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : notify 203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Asynchronous notification callback to framework 205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::notify(const struct camera3_callback_ops *, 214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_notify_msg_t *msg) 215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO - Implement 217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 2349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Create metadata channel and initialize it 237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 2389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCameraHandle->ops, channelCb); 239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mMetadataChannel == NULL) { 240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to allocate metadata channel", __func__); 2419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = -ENOMEM; 2429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err1; 2439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 2449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = mMetadataChannel->initialize(); 2459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 2469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: metadata channel initialization failed", __func__); 2479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err2; 2489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 2499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 2509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Initialize parameter heap and structure */ 2519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap = new QCamera3HeapMemory(); 2529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (mParamHeap == NULL) { 2539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: creation of mParamHeap failed", __func__); 2549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err2; 255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 2569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = mParamHeap->allocate(sizeof(parm_buffer_t), 1, false); 2579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 2589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: allocation of mParamHeap failed", __func__); 2599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err3; 2609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 2619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 2629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CAM_MAPPING_BUF_TYPE_PARM_BUF, 2639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap->getFd(0), sizeof(parm_buffer_t)); 2649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 2659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: map_buf failed for mParamHeap", __func__); 2669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang goto err4; 2679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 2689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParameters = (parm_buffer_t *)DATA_PTR(mParamHeap, 0); 2699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 2709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCallbackOps = callback_ops; 2719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 2729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 2739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr4: 2749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap->deallocate(); 2759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr3: 2769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mParamHeap; 2779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mParamHeap = NULL; 2789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr2: 2799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mMetadataChannel; 2809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMetadataChannel = NULL; 2819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangerr1: 2829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *inputStream = NULL; 318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT) { 321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* TODO: Clean up no longer used streams, and maintain others if this 331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * is not the 1st time configureStreams is called */ 332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMetadataChannel->stop(); 334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_INPUT: 343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_BIDIRECTIONAL: 347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang GRALLOC_USAGE_HW_CAMERA_WRITE; 349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_OUTPUT: 352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 3669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCameraHandle->ops, channelCb, newStream); 367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (channel == NULL) { 368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: allocation of channel failed", __func__); 369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->priv = channel; 373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case HAL_PIXEL_FORMAT_BLOB: 375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel = new QCamera3PicChannel(mCameraHandle->camera_handle, 3769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mCameraHandle->ops, channelCb, newStream); 377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (channel == NULL) { 378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: allocation of channel failed", __func__); 379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->priv = channel; 383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO: Add support for app consumed format? 386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 3969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 3979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Cannot reuse settings across configure call 3989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang memset(mParameters, 0, sizeof(parm_buffer_t)); 399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return 0; 400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : registerStreamBuffers 404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set == NULL) { 418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set->stream == NULL) { 422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set->num_buffers < 1) { 426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set->buffers == NULL) { 430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < buffer_set->num_buffers; i++) { 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (stream->stream_type != CAMERA3_STREAM_OUTPUT) { 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: not yet support non output type stream", __func__); 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 45180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 45280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : processCaptureRequest 45380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 4549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * DESCRIPTION: process a capture request from camera service 45580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 45680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 45780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @request : request from framework to process 45880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 45980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : 46080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 46180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 4629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::processCaptureRequest( 4639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 46480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 46580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = NO_ERROR; 4669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ssize_t idx = 0; 4679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t *b; 4689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang CameraMetadata meta; 4699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 4709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang /* Sanity check the request */ 4719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request == NULL) { 4729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: NULL capture request", __func__); 4739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 4769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang uint32_t frameNumber = request->frame_number; 4779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL && 4789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang request->input_buffer->stream != mInputStream) { 4799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Input buffer not from input stream!", 4809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 4819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4839de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->num_output_buffers < 1 || request->output_buffers == NULL) { 4849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: No output buffers provided!", 4859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __FUNCTION__, frameNumber); 4869de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4879de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4889de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (request->input_buffer != NULL) { 4899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //TODO 4909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Not supporting input buffer yet", __func__); 4919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 4929de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 4939de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 4949de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Validate all buffers 4959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers; 4969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang do { 4979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = 4989de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang static_cast<QCamera3Channel*>(b->stream->priv); 4999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 5009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!", 5019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 5029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5049de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->status != CAMERA3_BUFFER_STATUS_OK) { 5059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Status not OK!", 5069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 5079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->release_fence != -1) { 5109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: Has a release fence!", 5119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 5129de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (b->buffer == NULL) { 5159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!", 5169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang __func__, frameNumber, idx); 5179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return BAD_VALUE; 5189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang idx++; 5209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang b = request->output_buffers + idx; 5219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } while (idx < (ssize_t)request->num_output_buffers); 5229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 52380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang rc = setFrameParameters(request->settings); 5249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 5259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: fail to set frame parameters", __func__); 5269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 5279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Notify metadata channel we receive a request 5309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMetadataChannel->request(NULL); 5319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Call request on other streams 5339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang for (size_t i = 0; i < request->num_output_buffers; i++) { 5349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const camera3_stream_buffer_t& output = request->output_buffers[i]; 5359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv; 5369de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (channel == NULL) { 5379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: invalid channel pointer for stream", __func__); 5389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang continue; 5399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = channel->request(&output); 5429de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) 5439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: request failed", __func__); 5449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //Block on conditional variable 5479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_lock(&mRequestLock); 5489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 1; 5499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang while (mPendingRequest == 1) { 5509de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_wait(&mRequestCond, &mRequestLock); 5519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_unlock(&mRequestLock); 5539de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 55480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 55580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 55680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 5579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang/*=========================================================================== 5589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * FUNCTION : channelCb 5599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 5609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 5619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 5629de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * PARAMETERS : 5639de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * @frame : frame information from mm-camera-interface 5649de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 5659de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * 5669de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * RETURN : NONE 5679de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang *==========================================================================*/ 5689de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangvoid QCamera3HardwareInterface::channelCb(mm_camera_buf_def_t *frame, 5699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_stream_buffer_t *buffer) 5709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 5719de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (frame->stream_type == CAM_STREAM_TYPE_METADATA) { 5729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // Signal to unblock processCaptureRequest 5739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_lock(&mRequestLock); 5749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mPendingRequest = 0; 5759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_cond_signal(&mRequestCond); 5769de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang pthread_mutex_unlock(&mRequestLock); 5779de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 5789de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 5799de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang //TODO: Gives frame and buffer to buffer aggregator. 5809de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 5819de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 5829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 593625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 602625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 608625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 610625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 611625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 615625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 616625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 617625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 618625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang delete capabilityHeap; 648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang android::CameraMetadata staticInfo; 671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); 674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths, 680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths_count); 681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang (int*)gCamCapability[cameraId]->optical_stab_modes, 694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 69680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 69780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_position, 69880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 69980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 70080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width, 70180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->lens_shading_map_size.height}; 70280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 70380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang lens_shading_map_size, 70480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(lens_shading_map_size)/sizeof(int32_t)); 705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 70680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map, 70780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->lens_shading_map_size)/ sizeof(cam_dimension_t)); 708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 70980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width, 71080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map_size.height}; 71180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE, 71280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang geo_correction_map_size, 71380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(geo_correction_map_size)/sizeof(int32_t)); 71480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 71580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP, 71680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->geo_correction_map, 71780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(gCamCapability[cameraId]->geo_correction_map_size)/ sizeof(cam_dimension_t)); 71880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 71980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 72080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sensor_physical_size, 2); 72180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 72280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE, 72380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_time_range, 2); 72480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 72580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, 72680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_frame_duration, 1); 72780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 72880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 72980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, 73080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (int*)&gCamCapability[cameraId]->color_arrangement, 1); 73180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 73280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width, 73380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->pixel_array_size.height}; 73480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 73580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang pixel_array_size, 2); 73680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 73780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width, 73880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->active_array_size.height}; 73980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 74080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang active_array_size, 2); 74180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 74280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL, 74380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->white_level, 1); 744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 74580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN, 74680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->black_level_pattern, 4); 74780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 74880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION, 74980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->flash_charge_duration, 1); 75080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 75180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS, 75280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_tone_map_curve_points, 1); 75380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 75480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 75580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (int*)&gCamCapability[cameraId]->max_face_detection_count, 1); 75680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 75780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT, 75880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->histogram_size, 1); 75980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 76080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT, 76180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_histogram_count, 1); 76280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 76380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width, 76480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->sharpness_map_size.height}; 76580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 76680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE, 76780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t)); 76880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 76980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE, 77080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->max_sharpness_map_value, 1); 77180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 77280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 77380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, 77480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang &gCamCapability[cameraId]->raw_min_duration, 77580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 1); 77680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 77780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang static const int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min, 77880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang gCamCapability[cameraId]->exposure_compensation_max}; 77980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 78080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang exposureCompensationRange, 78180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang sizeof(exposureCompensationRange)/sizeof(int32_t)); 78280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 78380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang uint8_t lensFacing = (gCamCapability[cameraId]->position == CAM_POSITION_BACK) ? 78480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT; 78580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1); 786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gStaticMetadata = staticInfo.release(); 788625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 789625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 790625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 791625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 794625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 797625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 801625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 802625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 803625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 804625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 810625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 811625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 812625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 813625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 814625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 816625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 817625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gStaticMetadata) { 818625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 819625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 820625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->static_camera_characteristics = gStaticMetadata; 843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera_metadata_t* QCamera3HardwareInterface::translateMetadata(int type) 860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang android::CameraMetadata settings; 867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 893625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 8969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, 8979de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang &gCamCapability[mCameraId]->exposure_compensation_default, 1); 898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 915625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 916625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 918625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 919625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 920625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 922625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 923625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_aperture = gCamCapability[mCameraId]->apertures[0]; 924625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 925625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 926625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 927625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 1); 928625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 929625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0]; 930625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 931625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 932625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 933625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 93780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : setFrameParameters 93880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 93980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: set parameters per frame as requested in the metadata from 94080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * framework 94180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 94280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 94380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 94480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 94580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 94680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 94780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 94880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 94980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::setFrameParameters(const camera_metadata_t *settings) 95080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 95180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*translate from camera_metadata_t type to parm_type_t*/ 95280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang int rc = 0; 95380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang android::CameraMetadata frame_settings; 95480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (settings == NULL && prevSettings == NULL) { 95580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*settings cannot be null for the first request*/ 95680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return BAD_VALUE; 95780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } else if (settings == NULL) { 95880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*do nothing? we have already configured the settings previously*/ 95980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } else{ 96080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang //reset the prevSettings 96180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (prevSettings != NULL) { 96280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang free(prevSettings); 96380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang prevSettings = NULL; 96480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 96580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang rc = translateMetadataToParameters(settings); 96680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 96780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang /*set the parameters to backend*/ 96880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return rc; 96980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 97080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 97180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 97280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * FUNCTION : translateMetadataToParameters 97380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 97480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t 97580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 97680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 97780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * PARAMETERS : 97880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * @settings : frame settings information from framework 97980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 98080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * 98180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * RETURN : success: NO_ERROR 98280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang * failure: 98380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang *==========================================================================*/ 98480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wangint QCamera3HardwareInterface::translateMetadataToParameters 98580e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang (const camera_metadata_t *settings) 98680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang{ 98780e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang return 0; 98880e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang} 98980e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang 99080e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang/*=========================================================================== 9919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang * FUNCTION : channelCb 992625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 993625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 994625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 995625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 996625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 997625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 998625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 999625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1000625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 1001625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 10029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangvoid QCamera3HardwareInterface::channelCb(mm_camera_buf_def_t *frame, 1003625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_buffer_t *buffer, void *userdata) 1004625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1005625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 1006625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 1007625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 1008625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 1009625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1010625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 10119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang hw->channelCb(frame, buffer); 1012625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 1013625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1014625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1015625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1016625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 1017625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1018625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 1019625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1020625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1021625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1022625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1023625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 1024625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 1025625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1026625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1027625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 1028625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 1029625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1030625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1031625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1032625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1033625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1034625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 1035625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1036625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1037625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->initialize(callback_ops); 1038625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1039625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1040625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1041625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 1042625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1043625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1044625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1045625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1046625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1047625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1048625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 1049625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 1050625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 1051625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1052625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1053625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 1054625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 1055625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 1056625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1057625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1058625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1061625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 1062625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1063625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->configureStreams(stream_list); 1064625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1065625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1066625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1067625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 1068625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1069625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 1070625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1071625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1072625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1073625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1074625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1075625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 1076625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 1077625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 1078625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1079625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1080625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1081625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1082625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1083625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 1084625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1085625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->registerStreamBuffers(buffer_set); 1086625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1087625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1088625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1089625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 1090625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1091625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 1092625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1093625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1094625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1095625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1096625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 1097625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 1098625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 10999de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface:: 11009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang construct_default_request_settings(const struct camera3_device *device, 11019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int type) 1102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 1105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 1106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 1107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 1108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 1109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 1110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 1111625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1112625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang fwk_metadata = hw->translateMetadata(type); 1113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 1115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 1119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 11279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangint QCamera3HardwareInterface::process_capture_request( 11289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang const struct camera3_device *device, 11299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang camera3_capture_request_t *request) 1130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 113180e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang QCamera3HardwareInterface *hw = 113280e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 113380e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang if (!hw) { 113480e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang ALOGE("%s: NULL camera device", __func__); 11359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 113680e50bfee66172f8a924573247aa99ee72bfe24fShuzhen Wang } 11379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 11389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return hw->processCaptureRequest(request); 1139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 1143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(const struct camera3_device *, 1153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang vendor_tag_query_ops_t* ops) 1154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*TODO - Implement*/ 1156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 1159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 1160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 1162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 1164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 1166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 1167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 1168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::dump(const struct camera3_device *, int fd) 1170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*TODO - Implement*/ 1172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 1175