Home | History | Annotate | Download | only in HAL
      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