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