6dd39ff3680c7b2f3ac4552010cf6a56a3cae2fb
[platform/framework/native/media.git] / src / FMedia_CameraCoordinator.h
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file                        FMedia_CameraCoordinator.h
20  * @brief                       This header file contains the declarations of the %_CameraCoordinator class.
21  *
22  */
23
24 #ifndef _FMEDIA_INTERNAL_CAMERA_COORDINATOR_H_
25 #define _FMEDIA_INTERNAL_CAMERA_COORDINATOR_H_
26
27 #include <unique_ptr.h>
28 #include <camera.h>
29 #include <recorder.h>
30 #include <FBaseColLinkedListT.h>
31 #include <FBaseColHashMapT.h>
32 #include <FMediaCameraTypes.h>
33 #include <FMediaRecorderTypes.h>
34 #include "FMedia_CameraTypes.h"
35 #include "FMedia_RecorderTypes.h"
36 #include "FMedia_CameraRefHelper.h"
37 #include "FMedia_CamPtrUtil.h"
38
39 namespace Tizen { namespace Media
40 {
41 class _ICameraCoordinatorListener;
42 class _CameraCoordinatorSafeHashMapT;
43
44 /**
45  * @class       _CameraCoordinator
46  * @brief       This class implements the _CameraCoordinator class.
47  *
48  */
49 class _CameraCoordinator
50         : public _CameraRefHelper
51 {
52 public:
53         /**
54         * Get the instance of _CameraCoordinator.
55         *
56         * @return               The _CameraCoordinator instance
57         * @param[in]    cameraDevice                    The camera device id.
58         * @exception    E_SUCCESS                               The method is successful.
59         * @exception    E_SYSTEM                                A system error has occurred.
60         * @exception    E_DEVICE_BUSY                   The device cannot be approached because of other operations.
61         * @exception    E_DEVICE_UNAVAILABLE    The device is unavailable.
62         */
63         static _CameraCoordinator* AddInstance(_CameraDeviceType cameraDevice);
64
65         /**
66         * Get the instance of _CameraCoordinator.
67         *
68         * @return               The _CameraCoordinator instance
69         * @param[in]    recorderDevice                  The recorder device id.
70         * @exception    E_SUCCESS                               The method is successful.
71         * @exception    E_SYSTEM                                A system error has occurred.
72         * @exception    E_DEVICE_BUSY                   The device cannot be approached because of other operations.
73         * @exception    E_DEVICE_UNAVAILABLE    The device is unavailable.
74         */
75         static _CameraCoordinator* AddInstance(_RecorderDeviceType recorderDevice);
76
77         /**
78         * Release the specific _CameraCoordinator.
79         *
80         * @param[in]    cameraDevice                    The camera device type
81         */
82         static void Release(_CameraDeviceType cameraDevice);
83
84         /**
85         * Release the specific _CameraCoordinator.
86         *
87         * @param[in]    recorderDevice                  The recorder device type
88         */
89         static void Release(_RecorderDeviceType recorderDevice);
90
91         /**
92         * Check whether it has the instance.
93         *
94         * @return               The _CameraCoordinator instance
95         * @param[in]    cameraDevice                    The camera device id.
96         * @exception    E_SUCCESS                               The method is successful.
97         * @exception    E_SYSTEM                                A system error has occurred.
98         * @exception    E_DEVICE_BUSY                   The device cannot be approached because of other operations.
99         * @exception    E_DEVICE_UNAVAILABLE    The device is unavailable.
100         */
101         static _CameraCoordinator* HasInstance(_CameraDeviceType cameraDevice);
102
103         /**
104         * Check whether it has the instance.
105         *
106         * @return               The _CameraCoordinator instance
107         * @param[in]    recorderDevice                  The recorder device id.
108         * @exception    E_SUCCESS                               The method is successful.
109         * @exception    E_SYSTEM                                A system error has occurred.
110         * @exception    E_DEVICE_BUSY                   The device cannot be approached because of other operations.
111         * @exception    E_DEVICE_UNAVAILABLE    The device is unavailable.
112         */
113         static _CameraCoordinator* HasInstance(_RecorderDeviceType recorderDevice);
114
115         /**
116          * This is the destructor for this class. @n
117          * All allocated resources are deallocated by this method. This method should be called in the same thread
118          * where the Construct() method is called.
119          *
120          * @see                 Construct()
121          */
122         virtual ~_CameraCoordinator(void);
123
124         /**
125         * Adds the listener to this object. @n
126         * Added listeners are called after this object's callbacks are called from the camera.
127         *
128         * @return               An error code
129         * @param[in]    listener                                        A listener instance
130         * @exception    E_SUCCESS                               The method is successful.
131         * @exception    E_SYSTEM                                A system error has occurred.
132         */
133         result AddCameraCoordinatorListener(_ICameraCoordinatorListener& listener);
134
135         /**
136         * Removes the listener from this object. @n
137         *
138         * @return               An error code
139         * @param[in]    listener                                        A listener instance
140         * @exception    E_SUCCESS                               The method is successful.
141         * @exception    E_SYSTEM                                A system error has occurred.
142         */
143         result RemoveCameraCoordinatorListener(_ICameraCoordinatorListener& listener);
144
145         /**
146         * Gets the mode.
147         *
148         * @return                  The camera mode
149         */
150         _CameraMode GetMode(void) const;
151
152         /**
153         * Gets the camera device selection.
154         *
155         * @return                  The camera device selection
156         */
157         _CameraDeviceType GetCameraDevice(void) const;
158
159         /**
160         * Gets the camera handle
161         *
162         * @return                  The camera handle
163         */
164         _CameraHandle GetCameraHandle(void) const;
165
166         /**
167         * Gets the recorder handle
168         *
169         * @return                  The recorder handle
170         */
171         _RecorderHandle GetRecorderHandle(void) const;
172
173         /**
174         * Notifies the mode changing status to _ICameraCoordinatorListener
175         *
176         * @return               An error code
177         * @param[in]    mode                    camera mode
178         * @remarks      This mtehod calls _ICameraCoordinatorListener::::OnCameraCoordinatorModeChangePrepared().
179         *                       This method will call every _ICameraCoordinatorListener which are registered to _CameraCoordinator.
180         */
181         result NotifyModeChangePrepared(_CameraMode mode);
182
183         /**
184         * Notifies the mode changed status to _ICameraCoordinatorListener
185         *
186         * @return               An error code
187         * @param[in]    mode                    camera mode
188         * @remarks      This mtehod calls _ICameraCoordinatorListener::::OnCameraCoordinatorModeChanged().
189         *                       This method will call every _ICameraCoordinatorListener which are registered to _CameraCoordinator.
190         */
191         result NotifyModeChanged(_CameraMode mode);
192
193
194         /**
195         * Notifies the other _ICameraCoordinatorListener is removed
196         *
197         * @return               An error code
198         * @param[in]    mode                    camera mode
199         * @remarks      This mtehod calls _ICameraCoordinatorListener::::OnCameraCoordinatorOtherRemoved().
200         *                       This method will call every _ICameraCoordinatorListener which are registered to _CameraCoordinator.
201         */
202         result NotifyOtherRemoved(void);
203
204         /**
205         * Start the preview.
206         *
207         * @return               An error code
208         * @param[in]    mode                                            The mode to set
209         * @exception    E_SUCCESS                                       The method is successful.
210         * @exception    E_INVALID_STATE                         This instance is in an invalid state for this method.
211         */
212         result StartMmPreview(void);
213
214         /**
215         * Stop the preview.
216         *
217         * @return               An error code
218         * @param[in]    mode                                            The mode to set
219         * @exception    E_SUCCESS                                       The method is successful.
220         * @exception    E_INVALID_STATE                         This instance is in an invalid state for this method.
221         */
222         result StopMmPreview(void);
223
224         /**
225         * Create videorecorder handle.
226         *
227         * @return               An error code
228         * @exception    E_SUCCESS                               The method is successful.
229         * @exception    E_SYSTEM                                A system error has occurred.
230         */
231         result CreateVideoRecorder(void);
232
233         /**
234         * Destory videorecorder handle.
235         *
236         * @return               An error code
237         * @exception    E_SUCCESS                               The method is successful.
238         * @exception    E_SYSTEM                                A system error has occurred.
239         */
240         result DestroyVideoRecorder(void);
241
242         /**
243         * Change camera source prview format.
244         *
245         * @return               An error code
246         * @exception    E_SUCCESS                               The method is successful.
247         * @exception    E_SYSTEM                                A system error has occurred.
248         */
249         result ChangeFormat(_CameraMode mode, bool callback, camera_pixel_format_e reloadCameraPreviewFormat);
250
251
252         /**
253         * Changes the camcorder mode.
254         *
255         * @return               An error code
256         * @param[in]    mode                                            The mode to set
257         * @param[in]    callback                                                The flag to call the callback
258         * @exception    E_SUCCESS                                       The method is successful.
259         * @exception    E_INVALID_STATE                         This instance is in an invalid state for this method.
260         * @exception    E_DEVICE_BUSY                           The device cannot be approached because of other operations.
261         * @exception    E_DEVICE_UNAVAILABLE            The device is unavailable.
262         * @exception    E_DEVICE_FAILED                         The device operation has failed.
263         * @exception    E_UNSUPPORTED_OPERATION  This operation is not supported.
264         */
265         result ChangeMode(_CameraMode mode, bool callback);
266
267         /**
268         * Check if the change mode can be calmly.
269         *
270         * @return               The flag of calm change mode
271         * @param[in]    mode                                            The mode to set
272         */
273         bool IsCalmChangeMode(_CameraMode mode);
274
275         /**
276         * Set source format.
277         *
278         * @return          An error code
279         * @param[in]    pixelFormat                      camera's preview format
280         */
281         result SetCameraSourceFormat(camera_pixel_format_e pixelFormat);
282
283         /**
284         * Get source format.
285         *
286         * @return          camera's preview format
287         */
288         camera_pixel_format_e GetCameraSourceFormat(void) const;
289
290         /**
291         * Captures the current image data from the camera sensor.
292         *
293         * @return               An error code
294         * @param[in]    capturingCb                                     The capture callback
295         * @param[in]    completedCb                             The capture completed callback
296         * @param[in]    pUserData                                       The user data
297         * @exception    E_SUCCESS                                       The method is successful.
298         * @exception    E_INVALID_STATE                         This instance is in an invalid state for this method.
299         * @exception    E_DEVICE_BUSY                           The device cannot be approached because of other operations.
300         * @exception    E_DEVICE_UNAVAILABLE            The device is unavailable.
301         * @exception    E_DEVICE_FAILED                         The device operation has failed.
302         * @exception    E_UNSUPPORTED_OPERATION  This operation is not supported.
303         * @exception    E_OUT_OF_MEMORY                         The memory is insufficient.
304         */
305         result StartCapture(camera_capturing_cb capturingCb , camera_capture_completed_cb completedCb , void *pUserData);
306
307         /**
308         * Start recording.
309         *
310         * @return               An error code
311         */
312         result StartRecord(void);
313
314         /**
315         * Gets the reloaded preview format of the camera.
316         *
317         * @return               An error code
318         */
319         camera_pixel_format_e GetReloadPreviewFormat(void) const;
320
321 private:
322         friend class _CameraCoordinatorSafeHashMapT;
323         /**
324          * This is the default constructor for this class.
325          *
326          * @remarks             After creating an instance of this class, the Construct() method must be called explicitly to
327          * initialize this instance.
328          * @see                 Construct()
329          */
330         _CameraCoordinator(void);
331
332         /**
333         * Initializes this instance of _CameraCoordinator.
334         *
335         * @return               An error code
336         * @param[in]    cameraDevice                    The camera device id.
337         * @exception    E_SUCCESS                               The method is successful.
338         * @exception    E_SYSTEM                                A system error has occurred.
339         * @exception    E_DEVICE_BUSY                   The device cannot be approached because of other operations.
340         * @exception    E_DEVICE_UNAVAILABLE    The device is unavailable.
341         */
342         result Construct(_CameraDeviceType cameraDevice);
343
344         /**
345         * Add the recorder
346         *
347         * @return               An error code
348         * @param[in]    recorderDevice                  The recorder device id.
349         * @exception    E_SUCCESS                               The method is successful.
350         * @exception    E_SYSTEM                                A system error has occurred.
351         */
352         result AddRecorder(_RecorderDeviceType recorderDevice);
353
354         /**
355         * Remove the recorder
356         *
357         * @param[in]    recorderDevice                  The recorder device id.
358         * @exception    E_SUCCESS                               The method is successful.
359         * @exception    E_SYSTEM                                A system error has occurred.
360         */
361         void RemoveRecorder(_RecorderDeviceType recorderDevice);
362
363         /**
364         * Converts the error from camera to Result.
365         *
366         * @return          An error code
367         * @param[in]    err                      camera error
368         */
369         result ConvertResult(int err) const;
370
371         /**
372         * Change the state.
373         *
374         * @return          An error code
375         * @param[in]    destState                        camera's destinationed state
376         * @remarks      This method makes the camera's state change. @n
377         *                       Acccording to this, Camera's state is changed.
378         */
379         result ChangeCameraStateTo(camera_state_e destState);
380
381         /**
382         * Gets the camera's state.
383         *
384         * @return                  The state
385         */
386         camera_state_e GetCameraState(void) const;
387
388         /**
389         * Gets the recorder's state.
390         *
391         * @return                  The state
392         */
393         recorder_state_e GetRecorderState(void) const;
394
395         /**
396         * Change the state.
397         *
398         * @return          An error code
399         * @param[in]    destState                        recorder's destinationed state
400         * @remarks      This method makes the camera's state change. @n
401         *                       acccording to this, VideoRecorder and AudioRecorder's state is changed.
402         */
403         result ChangeRecorderStateTo(recorder_state_e destState);
404
405         _CameraCoordinator(const _CameraCoordinator& rhs);
406         _CameraCoordinator& operator =(const _CameraCoordinator& rhs);
407
408         _CameraDeviceType __cameraDevice;
409         _CameraHandle __cameraHandle;
410         _RecorderHandle __recorderHandle;
411         _CameraMode __mode;
412         std::unique_ptr<Tizen::Base::Collection::LinkedListT <_ICameraCoordinatorListener*>, _ListPtrUtil::Remover> __pListenerList;
413         camera_pixel_format_e __reloadCameraPreviewFormat;
414
415         static _CameraCoordinatorSafeHashMapT* __pMap;
416 };
417
418 /**
419 * @class        _CameraCoordinatorSafeHashMapT
420 * @brief        This class is for handling safe HashMap.
421 *
422 */
423 class _CameraCoordinatorSafeHashMapT
424         : public Tizen::Base::Collection::HashMapT<_CameraDeviceType, _CameraCoordinator*>
425         , public virtual Tizen::Base::Collection::ICollectionT <Tizen::Base::Collection::MapEntryT <_CameraDeviceType, _CameraCoordinator*> >
426 {
427 public:
428         _CameraCoordinatorSafeHashMapT(void);
429         virtual ~_CameraCoordinatorSafeHashMapT(void);
430         void RemoveItems(void);
431
432 private:
433         _CameraCoordinatorSafeHashMapT(const _CameraCoordinatorSafeHashMapT& rhs);
434         _CameraCoordinatorSafeHashMapT& operator =(const _CameraCoordinatorSafeHashMapT& rhs);
435 };
436
437 }}
438 #endif