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