1 /* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are 5 * met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer in the documentation and/or other materials provided 11 * with the distribution. 12 * * Neither the name of The Linux Foundation nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 */ 29 30 #define LOG_NIDEBUG 0 31 #define LOG_TAG "QCamera2Factory" 32 33 #include <stdlib.h> 34 #include <utils/Errors.h> 35 #include <hardware/camera.h> 36 37 #include "QCamera2Factory.h" 38 39 namespace qcamera { 40 41 QCamera2Factory gQCamera2Factory; 42 43 /*=========================================================================== 44 * FUNCTION : QCamera2Factory 45 * 46 * DESCRIPTION: default constructor of QCamera2Factory 47 * 48 * PARAMETERS : none 49 * 50 * RETURN : None 51 *==========================================================================*/ 52 QCamera2Factory::QCamera2Factory() 53 { 54 mNumOfCameras = get_num_of_cameras(); 55 } 56 57 /*=========================================================================== 58 * FUNCTION : ~QCamera2Factory 59 * 60 * DESCRIPTION: deconstructor of QCamera2Factory 61 * 62 * PARAMETERS : none 63 * 64 * RETURN : None 65 *==========================================================================*/ 66 QCamera2Factory::~QCamera2Factory() 67 { 68 } 69 70 /*=========================================================================== 71 * FUNCTION : get_number_of_cameras 72 * 73 * DESCRIPTION: static function to query number of cameras detected 74 * 75 * PARAMETERS : none 76 * 77 * RETURN : number of cameras detected 78 *==========================================================================*/ 79 int QCamera2Factory::get_number_of_cameras() 80 { 81 return gQCamera2Factory.getNumberOfCameras(); 82 } 83 84 /*=========================================================================== 85 * FUNCTION : get_camera_info 86 * 87 * DESCRIPTION: static function to query camera information with its ID 88 * 89 * PARAMETERS : 90 * @camera_id : camera ID 91 * @info : ptr to camera info struct 92 * 93 * RETURN : int32_t type of status 94 * NO_ERROR -- success 95 * none-zero failure code 96 *==========================================================================*/ 97 int QCamera2Factory::get_camera_info(int camera_id, struct camera_info *info) 98 { 99 return gQCamera2Factory.getCameraInfo(camera_id, info); 100 } 101 102 /*=========================================================================== 103 * FUNCTION : getNumberOfCameras 104 * 105 * DESCRIPTION: query number of cameras detected 106 * 107 * PARAMETERS : none 108 * 109 * RETURN : number of cameras detected 110 *==========================================================================*/ 111 int QCamera2Factory::getNumberOfCameras() 112 { 113 return mNumOfCameras; 114 } 115 116 /*=========================================================================== 117 * FUNCTION : getCameraInfo 118 * 119 * DESCRIPTION: query camera information with its ID 120 * 121 * PARAMETERS : 122 * @camera_id : camera ID 123 * @info : ptr to camera info struct 124 * 125 * RETURN : int32_t type of status 126 * NO_ERROR -- success 127 * none-zero failure code 128 *==========================================================================*/ 129 int QCamera2Factory::getCameraInfo(int camera_id, struct camera_info *info) 130 { 131 int rc; 132 ALOGE("%s: E, camera_id = %d", __func__, camera_id); 133 134 if (!mNumOfCameras || camera_id >= mNumOfCameras || !info) { 135 return INVALID_OPERATION; 136 } 137 138 rc = QCamera2HardwareInterface::getCapabilities(camera_id, info); 139 ALOGV("%s: X", __func__); 140 return rc; 141 } 142 143 /*=========================================================================== 144 * FUNCTION : cameraDeviceOpen 145 * 146 * DESCRIPTION: open a camera device with its ID 147 * 148 * PARAMETERS : 149 * @camera_id : camera ID 150 * @hw_device : ptr to struct storing camera hardware device info 151 * 152 * RETURN : int32_t type of status 153 * NO_ERROR -- success 154 * none-zero failure code 155 *==========================================================================*/ 156 int QCamera2Factory::cameraDeviceOpen(int camera_id, 157 struct hw_device_t **hw_device) 158 { 159 int rc = NO_ERROR; 160 if (camera_id < 0 || camera_id >= mNumOfCameras) 161 return BAD_VALUE; 162 163 QCamera2HardwareInterface *hw = new QCamera2HardwareInterface(camera_id); 164 if (!hw) { 165 ALOGE("Allocation of hardware interface failed"); 166 return NO_MEMORY; 167 } 168 rc = hw->openCamera(hw_device); 169 if (rc != NO_ERROR) { 170 delete hw; 171 } 172 return rc; 173 } 174 175 /*=========================================================================== 176 * FUNCTION : camera_device_open 177 * 178 * DESCRIPTION: static function to open a camera device by its ID 179 * 180 * PARAMETERS : 181 * @camera_id : camera ID 182 * @hw_device : ptr to struct storing camera hardware device info 183 * 184 * RETURN : int32_t type of status 185 * NO_ERROR -- success 186 * none-zero failure code 187 *==========================================================================*/ 188 int QCamera2Factory::camera_device_open( 189 const struct hw_module_t *module, const char *id, 190 struct hw_device_t **hw_device) 191 { 192 if (module != &HAL_MODULE_INFO_SYM.common) { 193 ALOGE("Invalid module. Trying to open %p, expect %p", 194 module, &HAL_MODULE_INFO_SYM.common); 195 return INVALID_OPERATION; 196 } 197 if (!id) { 198 ALOGE("Invalid camera id"); 199 return BAD_VALUE; 200 } 201 return gQCamera2Factory.cameraDeviceOpen(atoi(id), hw_device); 202 } 203 204 struct hw_module_methods_t QCamera2Factory::mModuleMethods = { 205 open: QCamera2Factory::camera_device_open, 206 }; 207 208 }; // namespace qcamera 209