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_CALLBACK_NOTIFIER_H 18 #define HW_EMULATOR_CAMERA_CALLBACK_NOTIFIER_H 19 20 /* 21 * Contains declaration of a class CallbackNotifier that manages callbacks set 22 * via set_callbacks, enable_msg_type, and disable_msg_type camera HAL API. 23 */ 24 25 #include <utils/List.h> 26 #include <camera/CameraParameters.h> 27 28 namespace android { 29 30 class EmulatedCameraDevice; 31 class FrameProducer; 32 33 /* Manages callbacks set via set_callbacks, enable_msg_type, and disable_msg_type 34 * camera HAL API. 35 * 36 * Objects of this class are contained in EmulatedCamera objects, and handle 37 * relevant camera API callbacks. 38 * Locking considerations. Apparently, it's not allowed to call callbacks 39 * registered in this class, while holding a lock: recursion is quite possible, 40 * which will cause a deadlock. 41 */ 42 class CallbackNotifier { 43 public: 44 /* Constructs CallbackNotifier instance. */ 45 CallbackNotifier(); 46 47 /* Destructs CallbackNotifier instance. */ 48 ~CallbackNotifier(); 49 50 /**************************************************************************** 51 * Camera API 52 ***************************************************************************/ 53 54 public: 55 /* Actual handler for camera_device_ops_t::set_callbacks callback. 56 * This method is called by the containing emulated camera object when it is 57 * handing the camera_device_ops_t::set_callbacks callback. 58 */ 59 void setCallbacks(camera_notify_callback notify_cb, 60 camera_data_callback data_cb, 61 camera_data_timestamp_callback data_cb_timestamp, 62 camera_request_memory get_memory, 63 void* user); 64 65 /* Actual handler for camera_device_ops_t::enable_msg_type callback. 66 * This method is called by the containing emulated camera object when it is 67 * handing the camera_device_ops_t::enable_msg_type callback. 68 */ 69 void enableMessage(uint msg_type); 70 71 /* Actual handler for camera_device_ops_t::disable_msg_type callback. 72 * This method is called by the containing emulated camera object when it is 73 * handing the camera_device_ops_t::disable_msg_type callback. 74 */ 75 void disableMessage(uint msg_type); 76 77 /* Actual handler for camera_device_ops_t::store_meta_data_in_buffers 78 * callback. This method is called by the containing emulated camera object 79 * when it is handing the camera_device_ops_t::store_meta_data_in_buffers 80 * callback. 81 * Return: 82 * NO_ERROR on success, or an appropriate error status. 83 */ 84 status_t storeMetaDataInBuffers(bool enable); 85 86 /* Enables video recording. 87 * This method is called by the containing emulated camera object when it is 88 * handing the camera_device_ops_t::start_recording callback. 89 * Param: 90 * fps - Video frame frequency. This parameter determins when a frame 91 * received via onNextFrameAvailable call will be pushed through the 92 * callback. 93 * Return: 94 * NO_ERROR on success, or an appropriate error status. 95 */ 96 status_t enableVideoRecording(int fps); 97 98 /* Disables video recording. 99 * This method is called by the containing emulated camera object when it is 100 * handing the camera_device_ops_t::stop_recording callback. 101 */ 102 void disableVideoRecording(); 103 104 /* Releases video frame, sent to the framework. 105 * This method is called by the containing emulated camera object when it is 106 * handing the camera_device_ops_t::release_recording_frame callback. 107 */ 108 void releaseRecordingFrame(const void* opaque); 109 110 /* Send a message to the notify callback that auto-focus has completed. 111 * This method is called from the containing emulated camera object when it 112 * has received confirmation from the camera device that auto-focusing is 113 * completed. 114 */ 115 void autoFocusComplete(); 116 117 /* Actual handler for camera_device_ops_t::msg_type_enabled callback. 118 * This method is called by the containing emulated camera object when it is 119 * handing the camera_device_ops_t::msg_type_enabled callback. 120 * Note: this method doesn't grab a lock while checking message status, since 121 * upon exit the status would be undefined anyway. So, grab a lock before 122 * calling this method if you care about persisting a defined message status. 123 * Return: 124 * 0 if message is disabled, or non-zero value, if message is enabled. 125 */ isMessageEnabled(uint msg_type)126 inline int isMessageEnabled(uint msg_type) 127 { 128 return mMessageEnabler & msg_type; 129 } 130 131 /* Checks id video recording is enabled. 132 * This method is called by the containing emulated camera object when it is 133 * handing the camera_device_ops_t::recording_enabled callback. 134 * Note: this method doesn't grab a lock while checking video recordin status, 135 * since upon exit the status would be undefined anyway. So, grab a lock 136 * before calling this method if you care about persisting of a defined video 137 * recording status. 138 * Return: 139 * true if video recording is enabled, or false if it is disabled. 140 */ isVideoRecordingEnabled()141 inline bool isVideoRecordingEnabled() const 142 { 143 return mVideoRecEnabled; 144 } 145 146 /**************************************************************************** 147 * Public API 148 ***************************************************************************/ 149 150 public: 151 /* Resets the callback notifier. */ 152 void cleanupCBNotifier(); 153 154 /* Next frame is available in the camera device. 155 * This is a notification callback that is invoked by the camera device when 156 * a new frame is available. The captured frame is available through the 157 * |camera_dev| obejct. 158 * Note that most likely this method is called in context of a worker thread 159 * that camera device has created for frame capturing. 160 * Param: 161 * timestamp - Frame's timestamp. 162 * camera_dev - Camera device instance that delivered the frame. 163 */ 164 void onNextFrameAvailable(nsecs_t timestamp, 165 EmulatedCameraDevice* camera_dev); 166 167 /* Entry point for notifications that occur in camera device. 168 * Param: 169 * err - CAMERA_ERROR_XXX error code. 170 */ 171 void onCameraDeviceError(int err); 172 173 /* Sets, or resets taking picture state. 174 * This state control whether or not to notify the framework about compressed 175 * image, shutter, and other picture related events. 176 */ setTakingPicture(bool taking)177 void setTakingPicture(bool taking) 178 { 179 mTakingPicture = taking; 180 } 181 182 /* Sets JPEG quality used to compress frame during picture taking. */ setJpegQuality(int jpeg_quality)183 void setJpegQuality(int jpeg_quality) 184 { 185 mJpegQuality = jpeg_quality; 186 } 187 188 /* Sets the camera parameters that will be used to populate exif data in the 189 * picture. 190 */ setCameraParameters(CameraParameters cameraParameters)191 void setCameraParameters(CameraParameters cameraParameters) 192 { 193 mCameraParameters = cameraParameters; 194 } 195 196 /**************************************************************************** 197 * Private API 198 ***************************************************************************/ 199 200 protected: 201 /* Checks if it's time to push new video frame. 202 * Note that this method must be called while object is locked. 203 * Param: 204 * timestamp - Timestamp for the new frame. */ 205 bool isNewVideoFrameTime(nsecs_t timestamp); 206 207 /**************************************************************************** 208 * Data members 209 ***************************************************************************/ 210 211 protected: 212 /* Locks this instance for data change. */ 213 Mutex mObjectLock; 214 215 /* 216 * Callbacks, registered in set_callbacks. 217 */ 218 219 camera_notify_callback mNotifyCB; 220 camera_data_callback mDataCB; 221 camera_data_timestamp_callback mDataCBTimestamp; 222 camera_request_memory mGetMemoryCB; 223 void* mCBOpaque; 224 225 /* video frame queue for the CameraHeapMemory destruction */ 226 List<camera_memory_t*> mCameraMemoryTs; 227 228 /* Timestamp when last frame has been delivered to the framework. */ 229 nsecs_t mLastFrameTimestamp; 230 231 /* Video frequency in nanosec. */ 232 nsecs_t mFrameRefreshFreq; 233 234 /* Message enabler. */ 235 uint32_t mMessageEnabler; 236 237 /* JPEG quality used to compress frame during picture taking. */ 238 int mJpegQuality; 239 240 /* Camera parameters used for EXIF data in picture */ 241 CameraParameters mCameraParameters; 242 243 /* Video recording status. */ 244 bool mVideoRecEnabled; 245 246 /* Picture taking status. */ 247 bool mTakingPicture; 248 }; 249 250 }; /* namespace android */ 251 252 #endif /* HW_EMULATOR_CAMERA_CALLBACK_NOTIFIER_H */ 253