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