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
39namespace qcamera {
40
41QCamera2Factory gQCamera2Factory;
42
43/*===========================================================================
44 * FUNCTION   : QCamera2Factory
45 *
46 * DESCRIPTION: default constructor of QCamera2Factory
47 *
48 * PARAMETERS : none
49 *
50 * RETURN     : None
51 *==========================================================================*/
52QCamera2Factory::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 *==========================================================================*/
66QCamera2Factory::~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 *==========================================================================*/
79int 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 *==========================================================================*/
97int 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 *==========================================================================*/
111int 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 *==========================================================================*/
129int 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 *==========================================================================*/
156int 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 *==========================================================================*/
188int 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
204struct hw_module_methods_t QCamera2Factory::mModuleMethods = {
205    open: QCamera2Factory::camera_device_open,
206};
207
208}; // namespace qcamera
209