• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <cstdlib>
18 #include <pthread.h>
19 #include <hardware/camera3.h>
20 #include "CameraHAL.h"
21 
22 //#define LOG_NDEBUG 0
23 #define LOG_TAG "Camera"
24 #include <cutils/log.h>
25 
26 #define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL)
27 #include <cutils/trace.h>
28 
29 #include "Camera.h"
30 
31 namespace default_camera_hal {
32 
33 extern "C" {
34 // Shim passed to the framework to close an opened device.
close_device(hw_device_t * dev)35 static int close_device(hw_device_t* dev)
36 {
37     camera3_device_t* cam_dev = reinterpret_cast<camera3_device_t*>(dev);
38     Camera* cam = static_cast<Camera*>(cam_dev->priv);
39     return cam->close();
40 }
41 } // extern "C"
42 
Camera(int id)43 Camera::Camera(int id)
44   : mId(id),
45     mBusy(false),
46     mCallbackOps(NULL)
47 {
48     pthread_mutex_init(&mMutex,
49                        NULL); // No pthread mutex attributes.
50 
51     memset(&mDevice, 0, sizeof(mDevice));
52     mDevice.common.tag    = HARDWARE_DEVICE_TAG;
53     mDevice.common.close  = close_device;
54     mDevice.ops           = const_cast<camera3_device_ops_t*>(&sOps);
55     mDevice.priv          = this;
56 }
57 
~Camera()58 Camera::~Camera()
59 {
60 }
61 
open(const hw_module_t * module,hw_device_t ** device)62 int Camera::open(const hw_module_t *module, hw_device_t **device)
63 {
64     ALOGI("%s:%d: Opening camera device", __func__, mId);
65     ATRACE_BEGIN(__func__);
66     pthread_mutex_lock(&mMutex);
67     if (mBusy) {
68         pthread_mutex_unlock(&mMutex);
69         ATRACE_END();
70         ALOGE("%s:%d: Error! Camera device already opened", __func__, mId);
71         return -EBUSY;
72     }
73 
74     // TODO: open camera dev nodes, etc
75     mBusy = true;
76     mDevice.common.module = const_cast<hw_module_t*>(module);
77     *device = &mDevice.common;
78 
79     pthread_mutex_unlock(&mMutex);
80     ATRACE_END();
81     return 0;
82 }
83 
close()84 int Camera::close()
85 {
86     ALOGI("%s:%d: Closing camera device", __func__, mId);
87     ATRACE_BEGIN(__func__);
88     pthread_mutex_lock(&mMutex);
89     if (!mBusy) {
90         pthread_mutex_unlock(&mMutex);
91         ATRACE_END();
92         ALOGE("%s:%d: Error! Camera device not open", __func__, mId);
93         return -EINVAL;
94     }
95 
96     // TODO: close camera dev nodes, etc
97     mBusy = false;
98 
99     pthread_mutex_unlock(&mMutex);
100     ATRACE_END();
101     return 0;
102 }
103 
initialize(const camera3_callback_ops_t * callback_ops)104 int Camera::initialize(const camera3_callback_ops_t *callback_ops)
105 {
106     ALOGV("%s:%d: callback_ops=%p", __func__, mId, callback_ops);
107     mCallbackOps = callback_ops;
108     return 0;
109 }
110 
configureStreams(camera3_stream_configuration_t * stream_list)111 int Camera::configureStreams(camera3_stream_configuration_t *stream_list)
112 {
113     ALOGV("%s:%d: stream_list=%p", __func__, mId, stream_list);
114     // TODO: validate input, create internal stream representations
115     return 0;
116 }
117 
registerStreamBuffers(const camera3_stream_buffer_set_t * buf_set)118 int Camera::registerStreamBuffers(const camera3_stream_buffer_set_t *buf_set)
119 {
120     ALOGV("%s:%d: buffer_set=%p", __func__, mId, buf_set);
121     // TODO: register buffers with hardware
122     return 0;
123 }
124 
constructDefaultRequestSettings(int type)125 const camera_metadata_t* Camera::constructDefaultRequestSettings(int type)
126 {
127     ALOGV("%s:%d: type=%d", __func__, mId, type);
128     // TODO: return statically built default request
129     return NULL;
130 }
131 
processCaptureRequest(camera3_capture_request_t * request)132 int Camera::processCaptureRequest(camera3_capture_request_t *request)
133 {
134     ALOGV("%s:%d: request=%p", __func__, mId, request);
135     ATRACE_BEGIN(__func__);
136 
137     if (request == NULL) {
138         ALOGE("%s:%d: NULL request recieved", __func__, mId);
139         ATRACE_END();
140         return -EINVAL;
141     }
142 
143     // TODO: verify request; submit request to hardware
144     ATRACE_END();
145     return 0;
146 }
147 
getMetadataVendorTagOps(vendor_tag_query_ops_t * ops)148 void Camera::getMetadataVendorTagOps(vendor_tag_query_ops_t *ops)
149 {
150     ALOGV("%s:%d: ops=%p", __func__, mId, ops);
151     // TODO: return vendor tag ops
152 }
153 
dump(int fd)154 void Camera::dump(int fd)
155 {
156     ALOGV("%s:%d: Dumping to fd %d", fd);
157     // TODO: dprintf all relevant state to fd
158 }
159 
160 extern "C" {
161 // Get handle to camera from device priv data
camdev_to_camera(const camera3_device_t * dev)162 static Camera *camdev_to_camera(const camera3_device_t *dev)
163 {
164     return reinterpret_cast<Camera*>(dev->priv);
165 }
166 
initialize(const camera3_device_t * dev,const camera3_callback_ops_t * callback_ops)167 static int initialize(const camera3_device_t *dev,
168         const camera3_callback_ops_t *callback_ops)
169 {
170     return camdev_to_camera(dev)->initialize(callback_ops);
171 }
172 
configure_streams(const camera3_device_t * dev,camera3_stream_configuration_t * stream_list)173 static int configure_streams(const camera3_device_t *dev,
174         camera3_stream_configuration_t *stream_list)
175 {
176     return camdev_to_camera(dev)->configureStreams(stream_list);
177 }
178 
register_stream_buffers(const camera3_device_t * dev,const camera3_stream_buffer_set_t * buffer_set)179 static int register_stream_buffers(const camera3_device_t *dev,
180         const camera3_stream_buffer_set_t *buffer_set)
181 {
182     return camdev_to_camera(dev)->registerStreamBuffers(buffer_set);
183 }
184 
construct_default_request_settings(const camera3_device_t * dev,int type)185 static const camera_metadata_t *construct_default_request_settings(
186         const camera3_device_t *dev, int type)
187 {
188     return camdev_to_camera(dev)->constructDefaultRequestSettings(type);
189 }
190 
process_capture_request(const camera3_device_t * dev,camera3_capture_request_t * request)191 static int process_capture_request(const camera3_device_t *dev,
192         camera3_capture_request_t *request)
193 {
194     return camdev_to_camera(dev)->processCaptureRequest(request);
195 }
196 
get_metadata_vendor_tag_ops(const camera3_device_t * dev,vendor_tag_query_ops_t * ops)197 static void get_metadata_vendor_tag_ops(const camera3_device_t *dev,
198         vendor_tag_query_ops_t *ops)
199 {
200     camdev_to_camera(dev)->getMetadataVendorTagOps(ops);
201 }
202 
dump(const camera3_device_t * dev,int fd)203 static void dump(const camera3_device_t *dev, int fd)
204 {
205     camdev_to_camera(dev)->dump(fd);
206 }
207 } // extern "C"
208 
209 const camera3_device_ops_t Camera::sOps = {
210     .initialize              = default_camera_hal::initialize,
211     .configure_streams       = default_camera_hal::configure_streams,
212     .register_stream_buffers = default_camera_hal::register_stream_buffers,
213     .construct_default_request_settings =
214             default_camera_hal::construct_default_request_settings,
215     .process_capture_request = default_camera_hal::process_capture_request,
216     .get_metadata_vendor_tag_ops =
217             default_camera_hal::get_metadata_vendor_tag_ops,
218     .dump                    = default_camera_hal::dump
219 };
220 
221 } // namespace default_camera_hal
222