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