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 16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!gQCamera2Factory) { 16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin gQCamera2Factory = new QCamera2Factory(); 16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!gQCamera2Factory) { 16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to allocate Camera2Factory object"); 16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(gQCameraMuxer) 16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numCameras = gQCameraMuxer->get_number_of_cameras(); 17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin numCameras = gQCamera2Factory->getNumberOfCameras(); 17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("num of cameras: %d", numCameras); 17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return numCameras; 17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : get_camera_info 17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to query camera information with its ID 18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @info : ptr to camera info struct 18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::get_camera_info(int camera_id, struct camera_info *info) 19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(gQCameraMuxer) 19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCameraMuxer->get_camera_info(camera_id, info); 19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCamera2Factory->getCameraInfo(camera_id, info); 19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : set_callbacks 20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to set callbacks function to camera module 20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @callbacks : ptr to callback functions 20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : NO_ERROR -- success 21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::set_callbacks(const camera_module_callbacks_t *callbacks) 21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(gQCameraMuxer) 21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCameraMuxer->set_callbacks(callbacks); 21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCamera2Factory->setCallbacks(callbacks); 22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : open_legacy 22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to open older hal version implementation 22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hw_device : ptr to struct storing camera hardware device info 23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @halVersion: Based on camera_module_t.common.module_api_version 23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 0 -- success 23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::open_legacy(const struct hw_module_t* module, 23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const char* id, uint32_t halVersion, struct hw_device_t** device) 23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (module != &HAL_MODULE_INFO_SYM.common) { 24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid module. Trying to open %p, expect %p", 24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin module, &HAL_MODULE_INFO_SYM.common); 24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return INVALID_OPERATION; 24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!id) { 24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid camera id"); 24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(gQCameraMuxer) 25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCameraMuxer->open_legacy(module, id, halVersion, device); 25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCamera2Factory->openLegacy(atoi(id), halVersion, device); 25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : set_torch_mode 26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Attempt to turn on or off the torch mode of the flash unit. 26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @on : Indicates whether to turn the flash on or off 26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 0 -- success 26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::set_torch_mode(const char* camera_id, bool on) 27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return gQCamera2Factory->setTorchMode(camera_id, on); 27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getNumberOfCameras 27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: query number of cameras detected 27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : number of cameras detected 28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::getNumberOfCameras() 28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mNumOfCameras; 28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getCameraInfo 29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: query camera information with its ID 29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @info : ptr to camera info struct 29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::getCameraInfo(int camera_id, struct camera_info *info) 30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc; 30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sync_type_t cam_type = CAM_TYPE_MAIN; 30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mNumOfCameras || camera_id >= mNumOfCameras || !info || 30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (camera_id < 0)) { 30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error getting camera info!! mNumOfCameras = %d," 31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "camera_id = %d, info = %p", 31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mNumOfCameras, camera_id, info); 31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENODEV; 31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == mHalDescriptors ) { 31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Hal descriptor table is not initialized!"); 31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_INIT; 31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( mHalDescriptors[camera_id].device_version == 32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_DEVICE_API_VERSION_3_0 ) { 32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = QCamera3HardwareInterface::getCamInfo( 32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors[camera_id].cameraId, info); 32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mHalDescriptors[camera_id].device_version == 32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAMERA_DEVICE_API_VERSION_1_0) { 32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = QCamera2HardwareInterface::getCapabilities( 32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors[camera_id].cameraId, info, &cam_type); 32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Device version for camera id %d invalid %d", 33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_id, 33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors[camera_id].device_version); 33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setCallbacks 34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set callback functions to send asynchronous notifications to 34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * frameworks. 34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @callbacks : callback function pointer 34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::setCallbacks(const camera_module_callbacks_t *callbacks) 35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbacks = callbacks; 35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = QCameraFlash::getInstance().registerCallbacks(callbacks); 35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != 0) { 35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed to register callbacks with flash module!"); 35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : cameraDeviceOpen 36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: open a camera device with its ID 36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hw_device : ptr to struct storing camera hardware device info 37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::cameraDeviceOpen(int camera_id, 37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct hw_device_t **hw_device) 37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (camera_id < 0 || camera_id >= mNumOfCameras) 38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENODEV; 38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == mHalDescriptors ) { 38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Hal descriptor table is not initialized!"); 38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_INIT; 38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Open camera id %d API version %d", 39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_id, mHalDescriptors[camera_id].device_version); 39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( mHalDescriptors[camera_id].device_version == CAMERA_DEVICE_API_VERSION_3_0 ) { 39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera3HardwareInterface *hw = new QCamera3HardwareInterface(mHalDescriptors[camera_id].cameraId, 39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbacks); 39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Allocation of hardware interface failed"); 39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = hw->openCamera(hw_device); 40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != 0) { 40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete hw; 40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mHalDescriptors[camera_id].device_version == CAMERA_DEVICE_API_VERSION_1_0) { 40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = new QCamera2HardwareInterface((uint32_t)camera_id); 40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Allocation of hardware interface failed"); 40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = hw->openCamera(hw_device); 41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete hw; 41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Device version for camera id %d invalid %d", 41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_id, 41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mHalDescriptors[camera_id].device_version); 41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : camera_device_open 42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to open a camera device by its ID 42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hw_device : ptr to struct storing camera hardware device info 43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::camera_device_open( 43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const struct hw_module_t *module, const char *id, 43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct hw_device_t **hw_device) 43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (module != &HAL_MODULE_INFO_SYM.common) { 44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid module. Trying to open %p, expect %p", 44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin module, &HAL_MODULE_INFO_SYM.common); 44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return INVALID_OPERATION; 44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!id) { 44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid camera id"); 44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(gQCameraMuxer) 45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCameraMuxer->camera_device_open(module, id, hw_device); 45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else 45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = gQCamera2Factory->cameraDeviceOpen(atoi(id), hw_device); 45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstruct hw_module_methods_t QCamera2Factory::mModuleMethods = { 4601687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan .open = QCamera2Factory::camera_device_open, 46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; 46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : openLegacy 46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to open older hal version implementation 46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @halVersion: Based on camera_module_t.common.module_api_version 47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hw_device : ptr to struct storing camera hardware device info 47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 0 -- success 47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::openLegacy( 47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t cameraId, uint32_t halVersion, struct hw_device_t** hw_device) 47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("openLegacy halVersion: %d", halVersion); 48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Assumption: all cameras can support legacy API version 48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (cameraId < 0 || cameraId >= gQCamera2Factory->getNumberOfCameras()) 48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -ENODEV; 48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch(halVersion) 48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_DEVICE_API_VERSION_1_0: 48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface *hw = 49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin new QCamera2HardwareInterface((uint32_t)cameraId); 49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hw) { 49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Allocation of hardware interface failed"); 49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = hw->openCamera(hw_device); 49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete hw; 49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Device API version: %d for camera id %d invalid", 50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin halVersion, cameraId); 50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setTorchMode 51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Attempt to turn on or off the torch mode of the flash unit. 51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @camera_id : camera ID 51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @on : Indicates whether to turn the flash on or off 51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : 0 -- success 52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::setTorchMode(const char* camera_id, bool on) 52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int retVal(0); 52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin long cameraIdLong(-1); 52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int cameraIdInt(-1); 52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char* endPointer = NULL; 52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin errno = 0; 53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraFlash& flash = QCameraFlash::getInstance(); 53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cameraIdLong = strtol(camera_id, &endPointer, 10); 53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((errno == ERANGE) || 53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cameraIdLong < 0) || 53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (cameraIdLong >= static_cast<long>(get_number_of_cameras())) || 53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (endPointer == camera_id) || 53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (*endPointer != '\0')) { 53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = -EINVAL; 54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (on) { 54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cameraIdInt = static_cast<int>(cameraIdLong); 54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = flash.initFlash(cameraIdInt); 54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (retVal == 0) { 54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = flash.setFlashMode(cameraIdInt, on); 54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((retVal == 0) && (mCallbacks != NULL)) { 54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbacks->torch_mode_status_change(mCallbacks, 54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_id, 54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin TORCH_MODE_STATUS_AVAILABLE_ON); 55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (retVal == -EALREADY) { 55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Flash is already on, so treat this as a success. 55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = 0; 55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cameraIdInt = static_cast<int>(cameraIdLong); 55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = flash.setFlashMode(cameraIdInt, on); 55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (retVal == 0) { 56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = flash.deinitFlash(cameraIdInt); 56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((retVal == 0) && (mCallbacks != NULL)) { 56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCallbacks->torch_mode_status_change(mCallbacks, 56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_id, 56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin TORCH_MODE_STATUS_AVAILABLE_OFF); 56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (retVal == -EALREADY) { 56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Flash is already off, so treat this as a success. 56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin retVal = 0; 56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return retVal; 57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : isDualCamAvailable 57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to check whether we have dual Camera HW available 57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @hal3Enabled : HAL3 enable flag 58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : bool - true : have Dual Camera HW available 58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false : not have Dual Camera HW available 58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2Factory::isDualCamAvailable(int hal3Enabled) 58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool rc = FALSE; 58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int i = 0; 59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_info info; 59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sync_type_t cam_type = CAM_TYPE_MAIN; 59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (i = 0; i < mNumOfCameras; i++) { 59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!hal3Enabled) { 59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCamera2HardwareInterface::getCapabilities(i, &info, &cam_type); 59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(cam_type == CAM_TYPE_AUX) { 59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Have Dual Camera HW Avaiable."); 60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = TRUE; 60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera 60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 610