QCamera2Factory.cpp revision 66f9976540f830b0090ff2ca557b0364a53f2008
166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* Redistribution and use in source and binary forms, with or without 466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* modification, are permitted provided that the following conditions are 566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* met: 666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions of source code must retain the above copyright 766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* notice, this list of conditions and the following disclaimer. 866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions in binary form must reproduce the above 966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* copyright notice, this list of conditions and the following 1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* disclaimer in the documentation and/or other materials provided 1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* with the distribution. 1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Neither the name of The Linux Foundation nor the names of its 1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* contributors may be used to endorse or promote products derived 1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* from this software without specific prior written permission. 1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*/ 2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define LOG_TAG "QCamera2Factory" 3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies 3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdlib.h> 3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/Errors.h> 3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies 3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "camera.h" 3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "camera3.h" 3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "HAL/QCamera2HWI.h" 4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "HAL3/QCamera3HWI.h" 4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "util/QCameraFlash.h" 4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera2Factory.h" 4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraMuxer.h" 4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" { 4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_dbg.h" 4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinusing namespace android; 5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera { 5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 5366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera2Factory *gQCamera2Factory = NULL; 5466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraMuxer *gQCameraMuxer = NULL; 5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinpthread_mutex_t gCamLock = PTHREAD_MUTEX_INITIALIZER; 5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin//Total number of cameras opened simultaneously. 5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin//This variable updation is protected by gCamLock. 5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint8_t gNumCameraSessions = 0; 5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvolatile uint32_t gKpiDebugLevel = 1; 6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCamera2Factory 6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: default constructor of QCamera2Factory 6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 7166f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera2Factory::QCamera2Factory() 7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_info info; 7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors = NULL; 7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbacks = NULL; 7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mNumOfCameras = get_num_of_cameras(); 7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int bDualCamera = 0; 7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char propDefault[PROPERTY_VALUE_MAX]; 7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char prop[PROPERTY_VALUE_MAX]; 8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.HAL3.enabled", prop, "1"); 8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int isHAL3Enabled = atoi(prop); 8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Signifies whether system has to enable dual camera mode 8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(propDefault, PROPERTY_VALUE_MAX, "%d", isDualCamAvailable(isHAL3Enabled)); 8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.dual.camera", prop, propDefault); 8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bDualCamera = atoi(prop); 8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("dualCamera:%d ", bDualCamera); 8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(bDualCamera) { 9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Enabling QCamera Muxer"); 9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!gQCameraMuxer) { 9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMuxer::getCameraMuxer(&gQCameraMuxer, mNumOfCameras); 9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!gQCameraMuxer) { 9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error !! Failed to get QCameraMuxer"); 9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!gQCameraMuxer && (mNumOfCameras > 0) && 9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mNumOfCameras <= MM_CAMERA_MAX_NUM_SENSORS)) { 10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors = new hal_desc[mNumOfCameras]; 10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL != mHalDescriptors) { 10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t cameraId = 0; 10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i < mNumOfCameras ; i++, cameraId++) { 10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors[i].cameraId = cameraId; 10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Set Device version to 3.x when both HAL3 is enabled & its BAYER sensor 10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (isHAL3Enabled && !(is_yuv_sensor(cameraId))) { 10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors[i].device_version = 10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_DEVICE_API_VERSION_3_0; 11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors[i].device_version = 11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_DEVICE_API_VERSION_1_0; 11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Query camera at this point in order 11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //to avoid any delays during subsequent 11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //calls to 'getCameraInfo()' 11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin getCameraInfo(i, &info); 11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Not enough resources to allocate HAL descriptor table!"); 12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("%d camera devices detected!", mNumOfCameras); 12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : ~QCamera2Factory 12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: deconstructor of QCamera2Factory 13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 13666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera2Factory::~QCamera2Factory() 13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL != mHalDescriptors ) { 13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete [] mHalDescriptors; 14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (gQCameraMuxer) { 14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete gQCameraMuxer; 14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gQCameraMuxer = NULL; 14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : get_number_of_cameras 14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to query number of cameras detected 15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : number of cameras detected 15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::get_number_of_cameras() 15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int numCameras = 0; 15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!gQCamera2Factory) { 16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gQCamera2Factory = new QCamera2Factory(); 16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!gQCamera2Factory) { 16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to allocate Camera2Factory object"); 16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(gQCameraMuxer) 17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numCameras = gQCameraMuxer->get_number_of_cameras(); 17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numCameras = gQCamera2Factory->getNumberOfCameras(); 17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("num of cameras: %d", numCameras); 17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return numCameras; 17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : get_camera_info 18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to query camera information with its ID 18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @info : ptr to camera info struct 18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::get_camera_info(int camera_id, struct camera_info *info) 19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(gQCameraMuxer) 19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCameraMuxer->get_camera_info(camera_id, info); 19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCamera2Factory->getCameraInfo(camera_id, info); 19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : set_callbacks 20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to set callbacks function to camera module 20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @callbacks : ptr to callback functions 21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : NO_ERROR -- success 21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::set_callbacks(const camera_module_callbacks_t *callbacks) 21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(gQCameraMuxer) 21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCameraMuxer->set_callbacks(callbacks); 21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCamera2Factory->setCallbacks(callbacks); 22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : open_legacy 22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to open older hal version implementation 22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hw_device : ptr to struct storing camera hardware device info 23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @halVersion: Based on camera_module_t.common.module_api_version 23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 0 -- success 23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::open_legacy(const struct hw_module_t* module, 23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const char* id, uint32_t halVersion, struct hw_device_t** device) 24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (module != &HAL_MODULE_INFO_SYM.common) { 24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid module. Trying to open %p, expect %p", 24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin module, &HAL_MODULE_INFO_SYM.common); 24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return INVALID_OPERATION; 24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!id) { 24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid camera id"); 24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(gQCameraMuxer) 25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCameraMuxer->open_legacy(module, id, halVersion, device); 25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCamera2Factory->openLegacy(atoi(id), halVersion, device); 25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : set_torch_mode 26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Attempt to turn on or off the torch mode of the flash unit. 26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @on : Indicates whether to turn the flash on or off 26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 0 -- success 26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::set_torch_mode(const char* camera_id, bool on) 27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return gQCamera2Factory->setTorchMode(camera_id, on); 27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getNumberOfCameras 27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: query number of cameras detected 28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : number of cameras detected 28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::getNumberOfCameras() 28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mNumOfCameras; 28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getCameraInfo 29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: query camera information with its ID 29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @info : ptr to camera info struct 29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::getCameraInfo(int camera_id, struct camera_info *info) 30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc; 30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sync_type_t cam_type = CAM_TYPE_MAIN; 30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mNumOfCameras || camera_id >= mNumOfCameras || !info || 30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (camera_id < 0)) { 31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error getting camera info!! mNumOfCameras = %d," 31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "camera_id = %d, info = %p", 31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mNumOfCameras, camera_id, info); 31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENODEV; 31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == mHalDescriptors ) { 31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Hal descriptor table is not initialized!"); 31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_INIT; 31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( mHalDescriptors[camera_id].device_version == 32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_DEVICE_API_VERSION_3_0 ) { 32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = QCamera3HardwareInterface::getCamInfo( 32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors[camera_id].cameraId, info); 32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mHalDescriptors[camera_id].device_version == 32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_DEVICE_API_VERSION_1_0) { 32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = QCamera2HardwareInterface::getCapabilities( 32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors[camera_id].cameraId, info, &cam_type); 32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Device version for camera id %d invalid %d", 33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_id, 33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors[camera_id].device_version); 33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setCallbacks 34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set callback functions to send asynchronous notifications to 34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * frameworks. 34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @callbacks : callback function pointer 34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::setCallbacks(const camera_module_callbacks_t *callbacks) 35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbacks = callbacks; 35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = QCameraFlash::getInstance().registerCallbacks(callbacks); 35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != 0) { 35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to register callbacks with flash module!"); 36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : cameraDeviceOpen 36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: open a camera device with its ID 36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hw_device : ptr to struct storing camera hardware device info 37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::cameraDeviceOpen(int camera_id, 37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct hw_device_t **hw_device) 38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (camera_id < 0 || camera_id >= mNumOfCameras) 38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENODEV; 38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == mHalDescriptors ) { 38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Hal descriptor table is not initialized!"); 38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_INIT; 38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Open camera id %d API version %d", 39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_id, mHalDescriptors[camera_id].device_version); 39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( mHalDescriptors[camera_id].device_version == CAMERA_DEVICE_API_VERSION_3_0 ) { 39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera3HardwareInterface *hw = new QCamera3HardwareInterface(mHalDescriptors[camera_id].cameraId, 39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbacks); 39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Allocation of hardware interface failed"); 39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = hw->openCamera(hw_device); 40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != 0) { 40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete hw; 40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mHalDescriptors[camera_id].device_version == CAMERA_DEVICE_API_VERSION_1_0) { 40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = new QCamera2HardwareInterface((uint32_t)camera_id); 40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Allocation of hardware interface failed"); 40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = hw->openCamera(hw_device); 41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete hw; 41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Device version for camera id %d invalid %d", 41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_id, 41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors[camera_id].device_version); 41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : camera_device_open 42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to open a camera device by its ID 42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hw_device : ptr to struct storing camera hardware device info 43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::camera_device_open( 43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const struct hw_module_t *module, const char *id, 43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct hw_device_t **hw_device) 44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (module != &HAL_MODULE_INFO_SYM.common) { 44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid module. Trying to open %p, expect %p", 44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin module, &HAL_MODULE_INFO_SYM.common); 44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return INVALID_OPERATION; 44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!id) { 44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid camera id"); 44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(gQCameraMuxer) 45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCameraMuxer->camera_device_open(module, id, hw_device); 45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCamera2Factory->cameraDeviceOpen(atoi(id), hw_device); 45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstruct hw_module_methods_t QCamera2Factory::mModuleMethods = { 46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin open: QCamera2Factory::camera_device_open, 46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; 46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : openLegacy 46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to open older hal version implementation 46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @halVersion: Based on camera_module_t.common.module_api_version 47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hw_device : ptr to struct storing camera hardware device info 47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 0 -- success 47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::openLegacy( 47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t cameraId, uint32_t halVersion, struct hw_device_t** hw_device) 47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("openLegacy halVersion: %d", halVersion); 48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Assumption: all cameras can support legacy API version 48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cameraId < 0 || cameraId >= gQCamera2Factory->getNumberOfCameras()) 48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENODEV; 48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch(halVersion) 48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_DEVICE_API_VERSION_1_0: 49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new QCamera2HardwareInterface((uint32_t)cameraId); 49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Allocation of hardware interface failed"); 49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = hw->openCamera(hw_device); 49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete hw; 50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Device API version: %d for camera id %d invalid", 50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin halVersion, cameraId); 50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setTorchMode 51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Attempt to turn on or off the torch mode of the flash unit. 51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @on : Indicates whether to turn the flash on or off 52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 0 -- success 52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::setTorchMode(const char* camera_id, bool on) 52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int retVal(0); 52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin long cameraIdLong(-1); 52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int cameraIdInt(-1); 52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char* endPointer = NULL; 53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin errno = 0; 53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraFlash& flash = QCameraFlash::getInstance(); 53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cameraIdLong = strtol(camera_id, &endPointer, 10); 53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((errno == ERANGE) || 53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cameraIdLong < 0) || 53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cameraIdLong >= static_cast<long>(get_number_of_cameras())) || 53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (endPointer == camera_id) || 53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (*endPointer != '\0')) { 54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = -EINVAL; 54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (on) { 54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cameraIdInt = static_cast<int>(cameraIdLong); 54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = flash.initFlash(cameraIdInt); 54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (retVal == 0) { 54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = flash.setFlashMode(cameraIdInt, on); 54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((retVal == 0) && (mCallbacks != NULL)) { 54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbacks->torch_mode_status_change(mCallbacks, 54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_id, 55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin TORCH_MODE_STATUS_AVAILABLE_ON); 55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (retVal == -EALREADY) { 55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Flash is already on, so treat this as a success. 55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = 0; 55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cameraIdInt = static_cast<int>(cameraIdLong); 55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = flash.setFlashMode(cameraIdInt, on); 55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (retVal == 0) { 56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = flash.deinitFlash(cameraIdInt); 56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((retVal == 0) && (mCallbacks != NULL)) { 56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbacks->torch_mode_status_change(mCallbacks, 56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_id, 56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin TORCH_MODE_STATUS_AVAILABLE_OFF); 56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (retVal == -EALREADY) { 56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Flash is already off, so treat this as a success. 56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = 0; 57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return retVal; 57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : isDualCamAvailable 57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to check whether we have dual Camera HW available 58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hal3Enabled : HAL3 enable flag 58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : bool - true : have Dual Camera HW available 58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false : not have Dual Camera HW available 58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2Factory::isDualCamAvailable(int hal3Enabled) 58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool rc = FALSE; 59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int i = 0; 59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_info info; 59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sync_type_t cam_type = CAM_TYPE_MAIN; 59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < mNumOfCameras; i++) { 59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hal3Enabled) { 59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface::getCapabilities(i, &info, &cam_type); 59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(cam_type == CAM_TYPE_AUX) { 60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Have Dual Camera HW Avaiable."); 60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = TRUE; 60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera 61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 611