QCamera3HWI.cpp revision 625515beb9c1347216a2d261930ceb0d85ba1c47
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]; 49625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangconst camera_metadata_t *gStaticMetadata; 50625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 51625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 52625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera3_device_ops_t QCamera3HardwareInterface::mCameraOps = { 53625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang initialize: QCamera3HardwareInterface::initialize, 54625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang configure_streams: QCamera3HardwareInterface::configure_streams, 55625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang register_stream_buffers: QCamera3HardwareInterface::register_stream_buffers, 56625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings, 57625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang process_capture_request: QCamera3HardwareInterface::process_capture_request, 58625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang get_metadata_vendor_tag_ops: QCamera3HardwareInterface::get_metadata_vendor_tag_ops, 59625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang dump: QCamera3HardwareInterface::dump, 60625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; 61625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 62625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 63625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 64625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3HardwareInterface 65625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 66625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constructor of QCamera3HardwareInterface 67625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 68625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 69625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera ID 70625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 71625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 72625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 73625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId) 74625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang : mCameraId(cameraId), 75625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle(NULL), 76625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened(false), 77625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCallbackOps(NULL) 78625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 79625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.tag = HARDWARE_DEVICE_TAG; 80625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_2_0; 81625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //mCameraDevice.common.close = close_camera_device; 82625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.ops = &mCameraOps; 83625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraDevice.priv = this; 84625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->version = CAM_HAL_V3; 85625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 86625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 87625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 88625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3HardwareInterface 89625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 90625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: destructor of QCamera2HardwareInterface 91625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 92625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 93625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 94625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 95625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 96625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3HardwareInterface::~QCamera3HardwareInterface() 97625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 98625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang closeCamera(); 99625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @hw_device : double ptr for camera device struct 108625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 109625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 110625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 111625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 112625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device) 114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //int rc = NO_ERROR; 116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraOpened) { 118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return PERMISSION_DENIED; 120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = openCamera(); 123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc == 0) 124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = &mCameraDevice.common; 125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang else 126625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *hw_device = NULL; 127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : openCamera 132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: open camera 134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 135625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 136625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::openCamera() 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCameraHandle) { 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("Failure: Camera already opened"); 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return ALREADY_EXISTS; 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = camera_open(mCameraId); 148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!mCameraHandle) { 149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("camera_open failed."); 150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = true; 154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 158625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : closeCamera 160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: close camera 162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 163625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::closeCamera() 170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = NO_ERROR; 172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle); 174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle = NULL; 175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraOpened = false; 176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : sendCaptureResult 182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: send completed capture result metadata buffer along with possibly 184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * completed output stream buffers to the framework 185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::sendCaptureResult(const struct camera3_callback_ops *, 191625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_capture_result_t *result) 192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO - Implement 194625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 195625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 196625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 197625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : notify 198625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 199625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Asynchronous notification callback to framework 200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 208625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::notify(const struct camera3_callback_ops *, 209625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_notify_msg_t *msg) 210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO - Implement 212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 215625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 216625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Initialize frameworks callback functions 219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @callback_ops : callback function to frameworks 222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize( 227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_callback_ops *callback_ops) 228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCallbackOps = callback_ops; 230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO:Create metadata channel and initialize it 232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle, 233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle->ops, channelCbRoutine); 234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mMetadataChannel == NULL) { 235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to allocate metadata channel", __func__); 236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mMetadataChannel->initialize(); 239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configureStreams 243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input 245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * and output streams. 246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configureStreams( 254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *streamList) 255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Sanity check stream_list 257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList == NULL) { 258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream configuration", __func__); 259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->streams == NULL) { 263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL stream list", __func__); 264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (streamList->num_streams < 1) { 268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Bad number of streams requested: %d", __func__, 269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamList->num_streams); 270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *inputStream = NULL; 274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_INPUT) { 277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (inputStream != NULL) { 278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Multiple input streams requested!", __func__); 279625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 280625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 281625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang inputStream = newStream; 282625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 283625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mInputStream = inputStream; 285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* TODO: Clean up no longer used streams, and maintain others if this 287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * is not the 1st time configureStreams is called */ 288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* TODO: Reconstruct/reset metadata stream/channel */ 290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate channel objects for the requested streams */ 292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < streamList->num_streams; i++) { 293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *newStream = streamList->streams[i]; 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->priv == NULL) { 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //New stream, construct channel 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->stream_type) { 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_INPUT: 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ; 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3PicChannel::kMaxBuffers; 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_BIDIRECTIONAL: 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ | 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang GRALLOC_USAGE_HW_CAMERA_WRITE; 305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_STREAM_OUTPUT: 308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE; 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers; 310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type); 313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (newStream->stream_type == CAMERA3_STREAM_OUTPUT || 317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) { 318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel; 319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (newStream->format) { 320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED: 321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel = new QCamera3RegularChannel(mCameraHandle->camera_handle, 322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle->ops, channelCbRoutine, newStream); 323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (channel == NULL) { 324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: allocation of channel failed", __func__); 325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 327625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 328625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->priv = channel; 329625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 330625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case HAL_PIXEL_FORMAT_BLOB: 331625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel = new QCamera3PicChannel(mCameraHandle->camera_handle, 332625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle->ops, channelCbRoutine, newStream); 333625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (channel == NULL) { 334625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: allocation of channel failed", __func__); 335625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENOMEM; 336625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 337625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 338625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang newStream->priv = channel; 339625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 340625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 341625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO: Add support for app consumed format? 342625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 343625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: not a supported format 0x%x", __func__, newStream->format); 344625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 345625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 346625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 347625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 348625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Channel already exists for this stream 349625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang // Do nothing for now 350625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 351625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 352625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return 0; 353625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 354625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 355625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 356625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : registerStreamBuffers 357625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 358625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register buffers for a given stream with the HAL device. 359625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 360625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 361625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_list : streams to be configured 362625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 363625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 364625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 365625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 366625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::registerStreamBuffers( 367625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 368625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 369625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 370625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set == NULL) { 371625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid buffer_set parameter.", __func__); 372625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 373625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 374625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set->stream == NULL) { 375625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid stream parameter.", __func__); 376625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 377625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 378625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set->num_buffers < 1) { 379625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers); 380625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 381625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 382625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (buffer_set->buffers == NULL) { 383625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid buffers parameter.", __func__); 384625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 385625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 386625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 387625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (size_t i = 0; i < buffer_set->num_buffers; i++) { 388625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *stream = buffer_set->stream; 389625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)stream->priv; 390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (stream->stream_type != CAMERA3_STREAM_OUTPUT) { 392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: not yet support non output type stream", __func__); 393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers); 396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: registerBUffers for stream %p failed", __func__, stream); 398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX ) 405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initCapabilities 407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize camera capabilities in static data struct 409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 410625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 412625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initCapabilities(int cameraId) 418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_vtbl_t *cameraHandle = NULL; 421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *capabilityHeap = NULL; 422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = camera_open(cameraId); 424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!cameraHandle) { 425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: camera_open failed", __func__); 426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto open_failed; 428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Allocate memory for capability buffer */ 431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap = new QCamera3HeapMemory(); 432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false); 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != OK) { 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for cappability", __func__); 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto allocate_failed; 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Map memory for capability buffer */ 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t)); 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle, 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->getFd(0), 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto map_failed; 447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Capability */ 450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle); 451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query capability",__func__); 453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t)); 456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!gCamCapability[cameraId]) { 457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang goto query_failed; 459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0), 461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_capability_t)); 462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = 0; 463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 464625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangquery_failed: 465625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->unmap_buf(cameraHandle->camera_handle, 466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 467625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangmap_failed: 468625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang capabilityHeap->deallocate(); 469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang delete capabilityHeap; 470625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangallocate_failed: 471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle->ops->close_camera(cameraHandle->camera_handle); 472625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cameraHandle = NULL; 473625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangopen_failed: 474625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 475625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 476625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 477625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 478625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initStaticMetadata 479625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 480625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialize the static metadata 481625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 482625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 483625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 484625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 485625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 486625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 0 -- success 487625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * non-zero failure code 488625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 489625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initStaticMetadata(int cameraId) 490625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 491625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 492625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang android::CameraMetadata staticInfo; 493625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 494625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 495625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->min_focus_distance, 1); 496625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 497625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, 498625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang &gCamCapability[cameraId]->hyper_focal_distance, 1); 499625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 500625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 501625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths, 502625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->focal_lengths_count); 503625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 504625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 505625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, 506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures, 507625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->apertures_count); 508625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 509625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, 510625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities, 511625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->filter_densities_count); 512625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, 515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang (int*)gCamCapability[cameraId]->optical_stab_modes, 516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->optical_stab_modes_count); 517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, 520625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->lens_shading_map_size, 521625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(cam_dimension_t)/sizeof(int32_t)); */ 522625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang staticInfo.update(ANDROID_LENS_POSITION, 524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gCamCapability[cameraId]->lens_position, 525625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float)); 526625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 527625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 528625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang gStaticMetadata = staticInfo.release(); 529625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 530625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 532625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 533625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getCapabilities 534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera capabilities 536625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera capabilities 540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 543625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 545625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getCamInfo(int cameraId, 546625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct camera_info *info) 547625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 548625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 549625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 550625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gCamCapability[cameraId]) { 551625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initCapabilities(cameraId); 552625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 553625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //pthread_mutex_unlock(&g_camlock); 554625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 555625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 556625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 557625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 558625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (NULL == gStaticMetadata) { 559625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = initStaticMetadata(cameraId); 560625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc < 0) { 561625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 562625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 563625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 564625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 565625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch(gCamCapability[cameraId]->position) { 566625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_BACK: 567625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_BACK; 568625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 569625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 570625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAM_POSITION_FRONT: 571625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->facing = CAMERA_FACING_FRONT; 572625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 573625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 574625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 575625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId); 576625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = -1; 577625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 578625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->orientation = gCamCapability[cameraId]->sensor_mount_angle; 582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang info->static_camera_characteristics = gStaticMetadata; 584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#if 0 588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getMetadata 590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: query camera metadata 592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 593625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cameraId : camera Id 595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @info : camera info struct to be filled in with camera metadata 596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::getMetadata(int type) 602625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 603625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HeapMemory *metadataHeap = NULL; 604625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 605625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 606625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang metadataHeap = new QCamera3HeapMemory(); 607625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = metadataHeap->allocate(1, sizeof(metadata_type_t)); 608625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc != 0) { 609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No memory for metadata", __func__); 610625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 611625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle, 613625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY, 614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang metadataHeap->getFd(0), 615625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(metadata_type_t)); 616625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 617625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to map capability buffer", __func__); 618625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang metadataHeap->deallocate(); 619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang delete metadataHeap; 620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 621625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 622625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* Query Metadata */ 623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //rc = cameraHandle->ops->query_metadata(cameraHandle->camera_handle, type); 624625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mCameraHandle->ops->query_capability(mCameraHandle->camera_handle); 625625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 626625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if(rc < 0) { 627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: failed to query metadata",__func__); 628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 629625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*delete the old metadata saved in the HAL*/ 632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (curr_metadata != NULL) { 633625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang free(curr_metadata); 634625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang curr_metadata = NULL; 635625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 636625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang curr_metadata = (metadata_type_t *)malloc(sizeof(metadata_type_t)); 637625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!curr_metadata) { 638625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: out of memory", __func__); 639625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle, 640625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang CAM_MAPPING_BUF_TYPE_CAPABILITY); 641625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memcpy(curr_metadata, DATA_PTR(metadataHeap,0), 643625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang sizeof(metadata_type_t)); 644625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 645625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //metadata now saved in the HAL - still need to copy over to correct 646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //format and send to fwk 647625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#endif 650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 651625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : translateMetadata 652625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: translate the metadata into camera_metadata_t 654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 655625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : type of the request 656625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 657625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 658625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : success: camera_metadata_t* 659625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * failure: NULL 660625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 661625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 662625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangcamera_metadata_t* QCamera3HardwareInterface::translateMetadata(int type) 663625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 664625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mDefaultMetadata[type] != NULL) { 665625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 666625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 667625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //first time we are handling this request 668625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //fill up the metadata structure using the wrapper class 669625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang android::CameraMetadata settings; 670625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //translate from cam_capability_t to camera_metadata_tag_t 671625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE; 672625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_REQUEST_TYPE, &requestType, 1); 673625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 674625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*control*/ 675625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 676625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang uint8_t controlIntent = 0; 677625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang switch (type) { 678625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_PREVIEW: 679625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 680625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 681625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_STILL_CAPTURE: 682625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE; 683625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 684625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_RECORD: 685625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD; 686625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 687625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT: 688625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT; 689625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 690625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG: 691625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG; 692625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 693625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang default: 694625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM; 695625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; 696625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1); 698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION, &gCamCapability[mCameraId]->exposure_compensation_default, 1); 700625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 701625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF; 702625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1); 703625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 704625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF; 705625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1); 706625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 707625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO; 708625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1); 709625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 710625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO; 711625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_MODE, &controlMode, 1); 712625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 713625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF; 714625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1); 715625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 716625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO? 717625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1); 718625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 719625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*flash*/ 720625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF; 721625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_FLASH_MODE, &flashMode, 1); 722625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 723625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 724625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* lens */ 725625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_aperture = gCamCapability[mCameraId]->apertures[0]; 726625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1); 727625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0]; 729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density, 1); 730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 731625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0]; 732625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1); 733625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 734625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 735625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /* scalar */ 736625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //settings.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS, &gCamCapability[mCameraId]->min_duration, 1); 737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //settings.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS, &gCamCapability[mCameraId]->raw_min_duration, 1); 738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mDefaultMetadata[type] = settings.release(); 742625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mDefaultMetadata[type]; 743625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 744625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 745625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 746625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : channelCbRoutine 747625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 748625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Callback handler for all channels (streams, as well as metadata) 749625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @frame : frame information from mm-camera-interface 752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata. 753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata: userdata 754625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 755625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : NONE 756625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 757625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::channelCbRoutine(mm_camera_buf_def_t *frame, 758625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_buffer_t *buffer, void *userdata) 759625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 760625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata; 761625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (hw == NULL) { 762625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Invalid hw %p", __func__, hw); 763625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 764625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 765625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 766625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO: Gives frame and buffer to buffer aggregator. 767625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 768625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 769625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 770625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 771625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 772625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : initialize 773625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 774625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Pass framework callback pointers to HAL 775625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 778625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 779625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success : 0 780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -ENODEV 781625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 782625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 783625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::initialize(const struct camera3_device *device, 784625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_callback_ops_t *callback_ops) 785625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 788625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 789625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 790625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 791625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->initialize(callback_ops); 794625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 795625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 796625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 797625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : configure_streams 798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 799625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 800625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 801625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 802625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 803625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 804625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: 0 805625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: -EINVAL (if stream configuration is invalid) 806625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV (fatal error) 807625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 808625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 809625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::configure_streams( 810625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 811625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_configuration_t *stream_list) 812625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 813625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 814625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 815625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 816625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 817625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 818625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 819625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->configureStreams(stream_list); 820625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 821625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 822625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 823625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : register_stream_buffers 824625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 825625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Register stream buffers with the device 826625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 827625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 828625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 829625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 830625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 831625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::register_stream_buffers( 832625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const struct camera3_device *device, 833625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang const camera3_stream_buffer_set_t *buffer_set) 834625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 835625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 838625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 839625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -ENODEV; 840625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 841625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return hw->registerStreamBuffers(buffer_set); 842625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 843625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 844625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 845625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : construct_default_request_settings 846625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 847625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: Configure a settings buffer to meet the required use case 848625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 849625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 850625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 851625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 852625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : Success: Return valid metadata 853625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * Failure: Return NULL 854625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 855625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangconst camera_metadata_t* QCamera3HardwareInterface::construct_default_request_settings 856625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang(const struct camera3_device *device, int type) 857625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 858625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 859625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera_metadata_t* fwk_metadata = NULL; 860625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3HardwareInterface *hw = 861625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang reinterpret_cast<QCamera3HardwareInterface *>(device->priv); 862625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (!hw) { 863625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: NULL camera device", __func__); 864625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 865625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 866625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 867625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang fwk_metadata = hw->translateMetadata(type); 868625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 869625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return fwk_metadata; 870625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 871625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 872625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 873625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : process_capture_request 874625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 875625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 876625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 877625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 878625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 879625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 880625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 881625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 882625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint QCamera3HardwareInterface::process_capture_request(const struct camera3_device *, 883625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_capture_request_t *request) 884625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 885625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*TODO - Implement*/ 886625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return 0; 887625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 888625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 889625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 890625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : get_metadata_vendor_tag_ops 891625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 892625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 893625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 894625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 895625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 896625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 897625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 898625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 899625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 900625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::get_metadata_vendor_tag_ops(const struct camera3_device *, 901625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang vendor_tag_query_ops_t* ops) 902625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 903625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*TODO - Implement*/ 904625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 905625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 906625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 907625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : dump 908625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 909625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: 910625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 911625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 912625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 913625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 914625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 915625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 916625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 917625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3HardwareInterface::dump(const struct camera3_device *, int fd) 918625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 919625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang /*TODO - Implement*/ 920625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 921625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 922625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; //end namespace qcamera 923