Home | History | Annotate | Download | only in HAL3
      1 /* Copyright (c) 2012-2014, 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_TAG "QCamera3Factory"
     31 //#define LOG_NDEBUG 0
     32 
     33 #include <stdlib.h>
     34 #include <utils/Log.h>
     35 #include <utils/Errors.h>
     36 #include <hardware/camera3.h>
     37 
     38 #include "QCamera3Factory.h"
     39 
     40 using namespace android;
     41 
     42 namespace qcamera {
     43 
     44 QCamera3Factory *gQCamera3Factory = NULL;
     45 
     46 /*===========================================================================
     47  * FUNCTION   : QCamera3Factory
     48  *
     49  * DESCRIPTION: default constructor of QCamera3Factory
     50  *
     51  * PARAMETERS : none
     52  *
     53  * RETURN     : None
     54  *==========================================================================*/
     55 QCamera3Factory::QCamera3Factory()
     56 {
     57     camera_info info;
     58 
     59     mNumOfCameras = get_num_of_cameras();
     60 
     61     //Query camera at this point in order
     62     //to avoid any delays during subsequent
     63     //calls to 'getCameraInfo()'
     64     for (int i = 0 ; i < mNumOfCameras ; i++) {
     65         getCameraInfo(i, &info);
     66     }
     67     //
     68 
     69 }
     70 
     71 /*===========================================================================
     72  * FUNCTION   : ~QCamera3Factory
     73  *
     74  * DESCRIPTION: deconstructor of QCamera2Factory
     75  *
     76  * PARAMETERS : none
     77  *
     78  * RETURN     : None
     79  *==========================================================================*/
     80 QCamera3Factory::~QCamera3Factory()
     81 {
     82 }
     83 
     84 /*===========================================================================
     85  * FUNCTION   : get_number_of_cameras
     86  *
     87  * DESCRIPTION: static function to query number of cameras detected
     88  *
     89  * PARAMETERS : none
     90  *
     91  * RETURN     : number of cameras detected
     92  *==========================================================================*/
     93 int QCamera3Factory::get_number_of_cameras()
     94 {
     95     if (!gQCamera3Factory) {
     96         gQCamera3Factory = new QCamera3Factory();
     97         if (!gQCamera3Factory) {
     98             ALOGE("%s: Failed to allocate Camera3Factory object", __func__);
     99             return 0;
    100         }
    101     }
    102     return gQCamera3Factory->getNumberOfCameras();
    103 }
    104 
    105 /*===========================================================================
    106  * FUNCTION   : get_camera_info
    107  *
    108  * DESCRIPTION: static function to query camera information with its ID
    109  *
    110  * PARAMETERS :
    111  *   @camera_id : camera ID
    112  *   @info      : ptr to camera info struct
    113  *
    114  * RETURN     : int32_t type of status
    115  *              NO_ERROR  -- success
    116  *              none-zero failure code
    117  *==========================================================================*/
    118 int QCamera3Factory::get_camera_info(int camera_id, struct camera_info *info)
    119 {
    120     return gQCamera3Factory->getCameraInfo(camera_id, info);
    121 }
    122 
    123 /*===========================================================================
    124  * FUNCTION   : getNumberOfCameras
    125  *
    126  * DESCRIPTION: query number of cameras detected
    127  *
    128  * PARAMETERS : none
    129  *
    130  * RETURN     : number of cameras detected
    131  *==========================================================================*/
    132 int QCamera3Factory::getNumberOfCameras()
    133 {
    134     return mNumOfCameras;
    135 }
    136 
    137 /*===========================================================================
    138  * FUNCTION   : getCameraInfo
    139  *
    140  * DESCRIPTION: query camera information with its ID
    141  *
    142  * PARAMETERS :
    143  *   @camera_id : camera ID
    144  *   @info      : ptr to camera info struct
    145  *
    146  * RETURN     : int32_t type of status
    147  *              NO_ERROR  -- success
    148  *              none-zero failure code
    149  *==========================================================================*/
    150 int QCamera3Factory::getCameraInfo(int camera_id, struct camera_info *info)
    151 {
    152     int rc;
    153     ALOGV("%s: E, camera_id = %d", __func__, camera_id);
    154 
    155     if (!mNumOfCameras || camera_id >= mNumOfCameras || !info ||
    156         (camera_id < 0)) {
    157         return -ENODEV;
    158     }
    159 
    160     rc = QCamera3HardwareInterface::getCamInfo(camera_id, info);
    161     ALOGV("%s: X", __func__);
    162     return rc;
    163 }
    164 
    165 /*===========================================================================
    166  * FUNCTION   : cameraDeviceOpen
    167  *
    168  * DESCRIPTION: open a camera device with its ID
    169  *
    170  * PARAMETERS :
    171  *   @camera_id : camera ID
    172  *   @hw_device : ptr to struct storing camera hardware device info
    173  *
    174  * RETURN     : int32_t type of status
    175  *              NO_ERROR  -- success
    176  *              none-zero failure code
    177  *==========================================================================*/
    178 int QCamera3Factory::cameraDeviceOpen(int camera_id,
    179                     struct hw_device_t **hw_device)
    180 {
    181     int rc = NO_ERROR;
    182     if (camera_id < 0 || camera_id >= mNumOfCameras)
    183         return -ENODEV;
    184 
    185     QCamera3HardwareInterface *hw = new QCamera3HardwareInterface(camera_id);
    186     if (!hw) {
    187         ALOGE("Allocation of hardware interface failed");
    188         return NO_MEMORY;
    189     }
    190     rc = hw->openCamera(hw_device);
    191     if (rc != 0) {
    192         delete hw;
    193     }
    194     return rc;
    195 }
    196 
    197 /*===========================================================================
    198  * FUNCTION   : camera_device_open
    199  *
    200  * DESCRIPTION: static function to open a camera device by its ID
    201  *
    202  * PARAMETERS :
    203  *   @camera_id : camera ID
    204  *   @hw_device : ptr to struct storing camera hardware device info
    205  *
    206  * RETURN     : int32_t type of status
    207  *              NO_ERROR  -- success
    208  *              none-zero failure code
    209  *==========================================================================*/
    210 int QCamera3Factory::camera_device_open(
    211     const struct hw_module_t *module, const char *id,
    212     struct hw_device_t **hw_device)
    213 {
    214     if (module != &HAL_MODULE_INFO_SYM.common) {
    215         ALOGE("Invalid module. Trying to open %p, expect %p",
    216             module, &HAL_MODULE_INFO_SYM.common);
    217         return INVALID_OPERATION;
    218     }
    219     if (!id) {
    220         ALOGE("Invalid camera id");
    221         return BAD_VALUE;
    222     }
    223     return gQCamera3Factory->cameraDeviceOpen(atoi(id), hw_device);
    224 }
    225 
    226 struct hw_module_methods_t QCamera3Factory::mModuleMethods = {
    227     open: QCamera3Factory::camera_device_open,
    228 };
    229 
    230 }; // namespace qcamera
    231 
    232