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 #ifndef HW_EMULATOR_CAMERA_EMULATED_CAMERA2_H 18 #define HW_EMULATOR_CAMERA_EMULATED_CAMERA2_H 19 20 /* 21 * Contains declaration of a class EmulatedCamera that encapsulates 22 * functionality common to all version 2.0 emulated camera devices. Instances 23 * of this class (for each emulated camera) are created during the construction 24 * of the EmulatedCameraFactory instance. This class serves as an entry point 25 * for all camera API calls that defined by camera2_device_ops_t API. 26 */ 27 28 #include "hardware/camera2.h" 29 #include "system/camera_metadata.h" 30 #include "EmulatedBaseCamera.h" 31 #include <utils/Thread.h> 32 #include <utils/Mutex.h> 33 34 namespace android { 35 36 /* Encapsulates functionality common to all version 2.0 emulated camera devices 37 * 38 * Note that EmulatedCameraFactory instantiates object of this class just once, 39 * when EmulatedCameraFactory instance gets constructed. Connection to / 40 * disconnection from the actual camera device is handled by calls to 41 * connectDevice(), and closeCamera() methods of this class that are invoked in 42 * response to hw_module_methods_t::open, and camera_device::close callbacks. 43 */ 44 class EmulatedCamera2 : public camera2_device, public EmulatedBaseCamera { 45 public: 46 /* Constructs EmulatedCamera2 instance. 47 * Param: 48 * cameraId - Zero based camera identifier, which is an index of the camera 49 * instance in camera factory's array. 50 * module - Emulated camera HAL module descriptor. 51 */ 52 EmulatedCamera2(int cameraId, 53 struct hw_module_t* module); 54 55 /* Destructs EmulatedCamera2 instance. */ 56 virtual ~EmulatedCamera2(); 57 58 /**************************************************************************** 59 * Abstract API 60 ***************************************************************************/ 61 62 public: 63 64 /**************************************************************************** 65 * Public API 66 ***************************************************************************/ 67 68 public: 69 virtual status_t Initialize(); 70 71 /**************************************************************************** 72 * Camera module API and generic hardware device API implementation 73 ***************************************************************************/ 74 75 public: 76 virtual status_t connectCamera(hw_device_t** device); 77 78 virtual status_t closeCamera(); 79 80 virtual status_t getCameraInfo(struct camera_info* info) = 0; 81 82 /**************************************************************************** 83 * Camera API implementation. 84 * These methods are called from the camera API callback routines. 85 ***************************************************************************/ 86 87 protected: 88 /** Request input queue notification */ 89 virtual int requestQueueNotify(); 90 91 /** Count of requests in flight */ 92 virtual int getInProgressCount(); 93 94 /** Cancel all captures in flight */ 95 virtual int flushCapturesInProgress(); 96 97 virtual int constructDefaultRequest( 98 int request_template, 99 camera_metadata_t **request); 100 101 /** Output stream creation and management */ 102 virtual int allocateStream( 103 uint32_t width, 104 uint32_t height, 105 int format, 106 const camera2_stream_ops_t *stream_ops, 107 uint32_t *stream_id, 108 uint32_t *format_actual, 109 uint32_t *usage, 110 uint32_t *max_buffers); 111 112 virtual int registerStreamBuffers( 113 uint32_t stream_id, 114 int num_buffers, 115 buffer_handle_t *buffers); 116 117 virtual int releaseStream(uint32_t stream_id); 118 119 /** Input stream creation and management */ 120 virtual int allocateReprocessStream( 121 uint32_t width, 122 uint32_t height, 123 uint32_t format, 124 const camera2_stream_in_ops_t *reprocess_stream_ops, 125 uint32_t *stream_id, 126 uint32_t *consumer_usage, 127 uint32_t *max_buffers); 128 129 virtual int allocateReprocessStreamFromStream( 130 uint32_t output_stream_id, 131 const camera2_stream_in_ops_t *reprocess_stream_ops, 132 uint32_t *stream_id); 133 134 virtual int releaseReprocessStream(uint32_t stream_id); 135 136 /** 3A action triggering */ 137 virtual int triggerAction(uint32_t trigger_id, 138 int32_t ext1, int32_t ext2); 139 140 /** Custom tag definitions */ 141 virtual const char* getVendorSectionName(uint32_t tag); 142 virtual const char* getVendorTagName(uint32_t tag); 143 virtual int getVendorTagType(uint32_t tag); 144 145 /** Debug methods */ 146 147 virtual int dump(int fd); 148 149 /**************************************************************************** 150 * Camera API callbacks as defined by camera2_device_ops structure. See 151 * hardware/libhardware/include/hardware/camera2.h for information on each 152 * of these callbacks. Implemented in this class, these callbacks simply 153 * dispatch the call into an instance of EmulatedCamera2 class defined in 154 * the 'camera_device2' parameter. 155 ***************************************************************************/ 156 157 private: 158 /** Input request queue */ 159 static int set_request_queue_src_ops(const camera2_device_t *, 160 const camera2_request_queue_src_ops *queue_src_ops); 161 static int notify_request_queue_not_empty(const camera2_device_t *); 162 163 /** Output frame queue */ 164 static int set_frame_queue_dst_ops(const camera2_device_t *, 165 const camera2_frame_queue_dst_ops *queue_dst_ops); 166 167 /** In-progress request management */ 168 static int get_in_progress_count(const camera2_device_t *); 169 170 static int flush_captures_in_progress(const camera2_device_t *); 171 172 /** Request template creation */ 173 static int construct_default_request(const camera2_device_t *, 174 int request_template, 175 camera_metadata_t **request); 176 177 /** Stream management */ 178 static int allocate_stream(const camera2_device_t *, 179 uint32_t width, 180 uint32_t height, 181 int format, 182 const camera2_stream_ops_t *stream_ops, 183 uint32_t *stream_id, 184 uint32_t *format_actual, 185 uint32_t *usage, 186 uint32_t *max_buffers); 187 188 static int register_stream_buffers(const camera2_device_t *, 189 uint32_t stream_id, 190 int num_buffers, 191 buffer_handle_t *buffers); 192 193 static int release_stream(const camera2_device_t *, 194 uint32_t stream_id); 195 196 static int allocate_reprocess_stream(const camera2_device_t *, 197 uint32_t width, 198 uint32_t height, 199 uint32_t format, 200 const camera2_stream_in_ops_t *reprocess_stream_ops, 201 uint32_t *stream_id, 202 uint32_t *consumer_usage, 203 uint32_t *max_buffers); 204 205 static int allocate_reprocess_stream_from_stream(const camera2_device_t *, 206 uint32_t output_stream_id, 207 const camera2_stream_in_ops_t *reprocess_stream_ops, 208 uint32_t *stream_id); 209 210 static int release_reprocess_stream(const camera2_device_t *, 211 uint32_t stream_id); 212 213 /** 3A triggers*/ 214 static int trigger_action(const camera2_device_t *, 215 uint32_t trigger_id, 216 int ext1, 217 int ext2); 218 219 /** Notifications to application */ 220 static int set_notify_callback(const camera2_device_t *, 221 camera2_notify_callback notify_cb, 222 void *user); 223 224 /** Vendor metadata registration */ 225 static int get_metadata_vendor_tag_ops(const camera2_device_t *, 226 vendor_tag_query_ops_t **ops); 227 // for get_metadata_vendor_tag_ops 228 static const char* get_camera_vendor_section_name( 229 const vendor_tag_query_ops_t *, 230 uint32_t tag); 231 static const char* get_camera_vendor_tag_name( 232 const vendor_tag_query_ops_t *, 233 uint32_t tag); 234 static int get_camera_vendor_tag_type( 235 const vendor_tag_query_ops_t *, 236 uint32_t tag); 237 238 static int dump(const camera2_device_t *, int fd); 239 240 /** For hw_device_t ops */ 241 static int close(struct hw_device_t* device); 242 243 /**************************************************************************** 244 * Data members shared with implementations 245 ***************************************************************************/ 246 protected: 247 /** Mutex for calls through camera2 device interface */ 248 Mutex mMutex; 249 250 bool mStatusPresent; 251 252 const camera2_request_queue_src_ops *mRequestQueueSrc; 253 const camera2_frame_queue_dst_ops *mFrameQueueDst; 254 255 struct TagOps : public vendor_tag_query_ops { 256 EmulatedCamera2 *parent; 257 }; 258 TagOps mVendorTagOps; 259 260 void sendNotification(int32_t msgType, 261 int32_t ext1, int32_t ext2, int32_t ext3); 262 263 /**************************************************************************** 264 * Data members 265 ***************************************************************************/ 266 private: 267 static camera2_device_ops_t sDeviceOps; 268 camera2_notify_callback mNotifyCb; 269 void* mNotifyUserPtr; 270 }; 271 272 }; /* namespace android */ 273 274 #endif /* HW_EMULATOR_CAMERA_EMULATED_CAMERA2_H */ 275