blob: 9825d5d4816cdd637dc08b67efbda8439f98360f
1 | /* |
2 | * Copyright (C) 2011 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 | #ifndef HW_EMULATOR_CAMERA_EMULATED_CAMERA_H |
18 | #define HW_EMULATOR_CAMERA_EMULATED_CAMERA_H |
19 | |
20 | /* |
21 | * Contains declaration of a class EmulatedCamera that encapsulates |
22 | * functionality common to all version 1.0 emulated camera devices ("fake", |
23 | * "webcam", "video file", etc.). Instances of this class (for each emulated |
24 | * camera) are created during the construction of the EmulatedCameraFactory |
25 | * instance. This class serves as an entry point for all camera API calls that |
26 | * defined by camera_device_ops_t API. |
27 | */ |
28 | |
29 | #include <camera/CameraParameters.h> |
30 | #include "EmulatedBaseCamera.h" |
31 | #include "EmulatedCameraDevice.h" |
32 | #include "PreviewWindow.h" |
33 | #include "CallbackNotifier.h" |
34 | |
35 | namespace android { |
36 | |
37 | /* Encapsulates functionality common to all version 1.0 emulated camera devices |
38 | * ("fake", "webcam", "file stream", etc.). |
39 | * |
40 | * Note that EmulatedCameraFactory instantiates object of this class just once, |
41 | * when EmulatedCameraFactory instance gets constructed. Connection to / |
42 | * disconnection from the actual camera device is handled by calls to |
43 | * connectDevice(), and closeCamera() methods of this class that are ivoked in |
44 | * response to hw_module_methods_t::open, and camera_device::close callbacks. |
45 | */ |
46 | class EmulatedCamera : public camera_device, public EmulatedBaseCamera { |
47 | public: |
48 | /* Constructs EmulatedCamera instance. |
49 | * Param: |
50 | * cameraId - Zero based camera identifier, which is an index of the camera |
51 | * instance in camera factory's array. |
52 | * module - Emulated camera HAL module descriptor. |
53 | */ |
54 | EmulatedCamera(int cameraId, |
55 | struct hw_module_t* module); |
56 | |
57 | /* Destructs EmulatedCamera instance. */ |
58 | virtual ~EmulatedCamera(); |
59 | |
60 | /**************************************************************************** |
61 | * Abstract API |
62 | ***************************************************************************/ |
63 | |
64 | public: |
65 | /* Gets emulated camera device used by this instance of the emulated camera. |
66 | */ |
67 | virtual EmulatedCameraDevice* getCameraDevice() = 0; |
68 | |
69 | /**************************************************************************** |
70 | * Public API |
71 | ***************************************************************************/ |
72 | |
73 | public: |
74 | /** Override of base class method */ |
75 | virtual status_t Initialize(); |
76 | |
77 | /* Next frame is available in the camera device. |
78 | * This is a notification callback that is invoked by the camera device when |
79 | * a new frame is available. |
80 | * Note that most likely this method is called in context of a worker thread |
81 | * that camera device has created for frame capturing. |
82 | * Param: |
83 | * frame - Captured frame, or NULL if camera device didn't pull the frame |
84 | * yet. If NULL is passed in this parameter use GetCurrentFrame method |
85 | * of the camera device class to obtain the next frame. Also note that |
86 | * the size of the frame that is passed here (as well as the frame |
87 | * returned from the GetCurrentFrame method) is defined by the current |
88 | * frame settings (width + height + pixel format) for the camera device. |
89 | * timestamp - Frame's timestamp. |
90 | * camera_dev - Camera device instance that delivered the frame. |
91 | */ |
92 | virtual void onNextFrameAvailable(const void* frame, |
93 | nsecs_t timestamp, |
94 | EmulatedCameraDevice* camera_dev); |
95 | |
96 | /* Entry point for notifications that occur in camera device. |
97 | * Param: |
98 | * err - CAMERA_ERROR_XXX error code. |
99 | */ |
100 | virtual void onCameraDeviceError(int err); |
101 | |
102 | /**************************************************************************** |
103 | * Camera API implementation |
104 | ***************************************************************************/ |
105 | |
106 | public: |
107 | /** Override of base class method */ |
108 | virtual status_t connectCamera(hw_device_t** device); |
109 | |
110 | /** Override of base class method */ |
111 | virtual status_t closeCamera(); |
112 | |
113 | /** Override of base class method */ |
114 | virtual status_t getCameraInfo(struct camera_info* info); |
115 | |
116 | /**************************************************************************** |
117 | * Camera API implementation. |
118 | * These methods are called from the camera API callback routines. |
119 | ***************************************************************************/ |
120 | |
121 | protected: |
122 | /* Actual handler for camera_device_ops_t::set_preview_window callback. |
123 | * NOTE: When this method is called the object is locked. |
124 | * Note that failures in this method are reported as negave EXXX statuses. |
125 | */ |
126 | virtual status_t setPreviewWindow(struct preview_stream_ops *window); |
127 | |
128 | /* Actual handler for camera_device_ops_t::set_callbacks callback. |
129 | * NOTE: When this method is called the object is locked. |
130 | */ |
131 | virtual void setCallbacks(camera_notify_callback notify_cb, |
132 | camera_data_callback data_cb, |
133 | camera_data_timestamp_callback data_cb_timestamp, |
134 | camera_request_memory get_memory, |
135 | void* user); |
136 | |
137 | /* Actual handler for camera_device_ops_t::enable_msg_type callback. |
138 | * NOTE: When this method is called the object is locked. |
139 | */ |
140 | virtual void enableMsgType(int32_t msg_type); |
141 | |
142 | /* Actual handler for camera_device_ops_t::disable_msg_type callback. |
143 | * NOTE: When this method is called the object is locked. |
144 | */ |
145 | virtual void disableMsgType(int32_t msg_type); |
146 | |
147 | /* Actual handler for camera_device_ops_t::msg_type_enabled callback. |
148 | * NOTE: When this method is called the object is locked. |
149 | * Return: |
150 | * 0 if message(s) is (are) disabled, != 0 if enabled. |
151 | */ |
152 | virtual int isMsgTypeEnabled(int32_t msg_type); |
153 | |
154 | /* Actual handler for camera_device_ops_t::start_preview callback. |
155 | * NOTE: When this method is called the object is locked. |
156 | * Note that failures in this method are reported as negave EXXX statuses. |
157 | */ |
158 | virtual status_t startPreview(); |
159 | |
160 | /* Actual handler for camera_device_ops_t::stop_preview callback. |
161 | * NOTE: When this method is called the object is locked. |
162 | */ |
163 | virtual void stopPreview(); |
164 | |
165 | /* Actual handler for camera_device_ops_t::preview_enabled callback. |
166 | * NOTE: When this method is called the object is locked. |
167 | * Return: |
168 | * 0 if preview is disabled, != 0 if enabled. |
169 | */ |
170 | virtual int isPreviewEnabled(); |
171 | |
172 | /* Actual handler for camera_device_ops_t::store_meta_data_in_buffers callback. |
173 | * NOTE: When this method is called the object is locked. |
174 | * Note that failures in this method are reported as negave EXXX statuses. |
175 | */ |
176 | virtual status_t storeMetaDataInBuffers(int enable); |
177 | |
178 | /* Actual handler for camera_device_ops_t::start_recording callback. |
179 | * NOTE: When this method is called the object is locked. |
180 | * Note that failures in this method are reported as negave EXXX statuses. |
181 | */ |
182 | virtual status_t startRecording(); |
183 | |
184 | /* Actual handler for camera_device_ops_t::stop_recording callback. |
185 | * NOTE: When this method is called the object is locked. |
186 | */ |
187 | virtual void stopRecording(); |
188 | |
189 | /* Actual handler for camera_device_ops_t::recording_enabled callback. |
190 | * NOTE: When this method is called the object is locked. |
191 | * Return: |
192 | * 0 if recording is disabled, != 0 if enabled. |
193 | */ |
194 | virtual int isRecordingEnabled(); |
195 | |
196 | /* Actual handler for camera_device_ops_t::release_recording_frame callback. |
197 | * NOTE: When this method is called the object is locked. |
198 | */ |
199 | virtual void releaseRecordingFrame(const void* opaque); |
200 | |
201 | /* Actual handler for camera_device_ops_t::auto_focus callback. |
202 | * NOTE: When this method is called the object is locked. |
203 | * Note that failures in this method are reported as negave EXXX statuses. |
204 | */ |
205 | virtual status_t setAutoFocus(); |
206 | |
207 | /* Actual handler for camera_device_ops_t::cancel_auto_focus callback. |
208 | * NOTE: When this method is called the object is locked. |
209 | * Note that failures in this method are reported as negave EXXX statuses. |
210 | */ |
211 | virtual status_t cancelAutoFocus(); |
212 | |
213 | /* Actual handler for camera_device_ops_t::take_picture callback. |
214 | * NOTE: When this method is called the object is locked. |
215 | * Note that failures in this method are reported as negave EXXX statuses. |
216 | */ |
217 | virtual status_t takePicture(); |
218 | |
219 | /* Actual handler for camera_device_ops_t::cancel_picture callback. |
220 | * NOTE: When this method is called the object is locked. |
221 | * Note that failures in this method are reported as negave EXXX statuses. |
222 | */ |
223 | virtual status_t cancelPicture(); |
224 | |
225 | /* Actual handler for camera_device_ops_t::set_parameters callback. |
226 | * NOTE: When this method is called the object is locked. |
227 | * Note that failures in this method are reported as negave EXXX statuses. |
228 | */ |
229 | virtual status_t setParameters(const char* parms); |
230 | |
231 | /* Actual handler for camera_device_ops_t::get_parameters callback. |
232 | * NOTE: When this method is called the object is locked. |
233 | * Return: |
234 | * Flattened parameters string. The caller will free the buffer allocated |
235 | * for the string by calling camera_device_ops_t::put_parameters callback. |
236 | */ |
237 | virtual char* getParameters(); |
238 | |
239 | /* Actual handler for camera_device_ops_t::put_parameters callback. |
240 | * Called to free the string returned from camera_device_ops_t::get_parameters |
241 | * callback. There is nothing more to it: the name of the callback is just |
242 | * misleading. |
243 | * NOTE: When this method is called the object is locked. |
244 | */ |
245 | virtual void putParameters(char* params); |
246 | |
247 | /* Actual handler for camera_device_ops_t::send_command callback. |
248 | * NOTE: When this method is called the object is locked. |
249 | * Note that failures in this method are reported as negave EXXX statuses. |
250 | */ |
251 | virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2); |
252 | |
253 | /* Actual handler for camera_device_ops_t::release callback. |
254 | * NOTE: When this method is called the object is locked. |
255 | */ |
256 | virtual void releaseCamera(); |
257 | |
258 | /* Actual handler for camera_device_ops_t::dump callback. |
259 | * NOTE: When this method is called the object is locked. |
260 | * Note that failures in this method are reported as negave EXXX statuses. |
261 | */ |
262 | virtual status_t dumpCamera(int fd); |
263 | |
264 | /**************************************************************************** |
265 | * Preview management. |
266 | ***************************************************************************/ |
267 | |
268 | protected: |
269 | /* Starts preview. |
270 | * Note that when this method is called mPreviewWindow may be NULL, |
271 | * indicating that framework has an intention to start displaying video |
272 | * frames, but didn't create the preview window yet. |
273 | * Return: |
274 | * NO_ERROR on success, or an appropriate error status on failure. |
275 | */ |
276 | virtual status_t doStartPreview(); |
277 | |
278 | /* Stops preview. |
279 | * This method reverts DoStartPreview. |
280 | * Return: |
281 | * NO_ERROR on success, or an appropriate error status on failure. |
282 | */ |
283 | virtual status_t doStopPreview(); |
284 | |
285 | /**************************************************************************** |
286 | * Private API. |
287 | ***************************************************************************/ |
288 | |
289 | protected: |
290 | /* Cleans up camera when released. */ |
291 | virtual status_t cleanupCamera(); |
292 | |
293 | /**************************************************************************** |
294 | * Camera API callbacks as defined by camera_device_ops structure. |
295 | * See hardware/libhardware/include/hardware/camera.h for information on |
296 | * each of these callbacks. Implemented in this class, these callbacks simply |
297 | * dispatch the call into an instance of EmulatedCamera class defined by the |
298 | * 'camera_device' parameter. |
299 | ***************************************************************************/ |
300 | |
301 | private: |
302 | static int set_preview_window(struct camera_device* dev, |
303 | struct preview_stream_ops* window); |
304 | |
305 | static void set_callbacks(struct camera_device* dev, |
306 | camera_notify_callback notify_cb, |
307 | camera_data_callback data_cb, |
308 | camera_data_timestamp_callback data_cb_timestamp, |
309 | camera_request_memory get_memory, |
310 | void* user); |
311 | |
312 | static void enable_msg_type(struct camera_device* dev, int32_t msg_type); |
313 | |
314 | static void disable_msg_type(struct camera_device* dev, int32_t msg_type); |
315 | |
316 | static int msg_type_enabled(struct camera_device* dev, int32_t msg_type); |
317 | |
318 | static int start_preview(struct camera_device* dev); |
319 | |
320 | static void stop_preview(struct camera_device* dev); |
321 | |
322 | static int preview_enabled(struct camera_device* dev); |
323 | |
324 | static int store_meta_data_in_buffers(struct camera_device* dev, int enable); |
325 | |
326 | static int start_recording(struct camera_device* dev); |
327 | |
328 | static void stop_recording(struct camera_device* dev); |
329 | |
330 | static int recording_enabled(struct camera_device* dev); |
331 | |
332 | static void release_recording_frame(struct camera_device* dev, |
333 | const void* opaque); |
334 | |
335 | static int auto_focus(struct camera_device* dev); |
336 | |
337 | static int cancel_auto_focus(struct camera_device* dev); |
338 | |
339 | static int take_picture(struct camera_device* dev); |
340 | |
341 | static int cancel_picture(struct camera_device* dev); |
342 | |
343 | static int set_parameters(struct camera_device* dev, const char* parms); |
344 | |
345 | static char* get_parameters(struct camera_device* dev); |
346 | |
347 | static void put_parameters(struct camera_device* dev, char* params); |
348 | |
349 | static int send_command(struct camera_device* dev, |
350 | int32_t cmd, |
351 | int32_t arg1, |
352 | int32_t arg2); |
353 | |
354 | static void release(struct camera_device* dev); |
355 | |
356 | static int dump(struct camera_device* dev, int fd); |
357 | |
358 | static int close(struct hw_device_t* device); |
359 | |
360 | /**************************************************************************** |
361 | * Data members |
362 | ***************************************************************************/ |
363 | |
364 | protected: |
365 | /* Locks this instance for parameters, state, etc. change. */ |
366 | Mutex mObjectLock; |
367 | |
368 | /* Camera parameters. */ |
369 | CameraParameters mParameters; |
370 | |
371 | /* Preview window. */ |
372 | PreviewWindow mPreviewWindow; |
373 | |
374 | /* Callback notifier. */ |
375 | CallbackNotifier mCallbackNotifier; |
376 | |
377 | private: |
378 | /* Registered callbacks implementing camera API. */ |
379 | static camera_device_ops_t mDeviceOps; |
380 | |
381 | /**************************************************************************** |
382 | * Common keys |
383 | ***************************************************************************/ |
384 | |
385 | public: |
386 | static const char FACING_KEY[]; |
387 | static const char ORIENTATION_KEY[]; |
388 | static const char RECORDING_HINT_KEY[]; |
389 | |
390 | /**************************************************************************** |
391 | * Common string values |
392 | ***************************************************************************/ |
393 | |
394 | /* Possible values for FACING_KEY */ |
395 | static const char FACING_BACK[]; |
396 | static const char FACING_FRONT[]; |
397 | }; |
398 | |
399 | }; /* namespace android */ |
400 | |
401 | #endif /* HW_EMULATOR_CAMERA_EMULATED_CAMERA_H */ |
402 |